簡體   English   中英

如何創建用於測試目的的 cgi.FieldStorage?

[英]How to create cgi.FieldStorage for testing purposes?

我正在創建一個實用程序來處理基於 webob 的應用程序中的文件上傳。 我想為它寫一些單元測試。

我的問題是 - 由於 webob 使用cgi.FieldStorage上傳文件,我想以一種簡單的方式創建一個FieldStorage實例(不模擬整個請求)。 這是我需要做的最少代碼(沒什么特別的,模擬上傳帶有“Lorem ipsum”內容的文本文件就可以了)。 還是嘲笑它更好?

經過一些研究,我想出了類似的東西:

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             

這足以進行我的單元測試。

你的答案在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)

我正在做這樣的事情,因為在我的腳本中我正在使用

import cgi

form = cgi.FieldStorage()

>>> # which result:
>>> FieldStorage(None, None, [])

當您的 URL 包含查詢字符串時,它將如下所示:

# URL: https://..../index.cgi?test=only
FieldStorage(None, None, [MiniFieldStorage('test', 'only')])

所以我只是手動將MiniFieldStorage推入form變量

import cgi

fs = cgi.MiniFieldStorage('test', 'only')
>>> fs
MiniFieldStorage('test', 'only')

form = cgi.FieldStorage()
form.list.append(fs)

>>> form
>>> FieldStorage(None, None, [MiniFieldStorage('test', 'only')])

# Now you can call it with same functions
>>> form.getfirst('test')
'only'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM