如何创建 cgi.FieldStorage 用于测试目的?

zef*_*ciu 5 python unit-testing cgi file-upload webob

我正在创建一个实用程序来处理基于 webob 的应用程序中的文件上传。我想为它编写一些单元测试。

我的问题是 - 当 webobcgi.FieldStorage用于上传文件时,我想以FieldStorage一种简单的方式创建一个实例(不模拟整个请求)。我需要做的最少代码是什么(没什么特别的,模拟带有“Lorem ipsum”内容的文本文件的上传就可以了)。或者嘲笑它是一个更好的主意?

zef*_*ciu 5

经过一些研究,我想出了这样的东西:

def _create_fs(mimetype, content):                                              
    fs = cgi.FieldStorage()                                                     
    fs.file = fs.make_file()                                                    
    fs.type = mimetype                                                          
    fs.file.write(content)                                                      
    fs.file.seek(0)                                                             
    return fs             
Run Code Online (Sandbox Code Playgroud)

这对于我的单元测试来说已经足够了。


Har*_*rut 5

您的答案在 python3 中失败。这是我的修改。我确定它并不完美,但至少它适用于 python2.7 和 python3.5。

from io import BytesIO

def _create_fs(self, mimetype, content, filename='uploaded.txt', name="file"):
    content = content.encode('utf-8')
    headers = {u'content-disposition': u'form-data; name="{}"; filename="{}"'.format(name, filename),
               u'content-length': len(content),
               u'content-type': mimetype}
    environ = {'REQUEST_METHOD': 'POST'}
    fp = BytesIO(content)
    return cgi.FieldStorage(fp=fp, headers=headers, environ=environ)
Run Code Online (Sandbox Code Playgroud)