6

webob ベースのアプリケーションでファイルのアップロードを処理するユーティリティを作成しています。そのための単体テストをいくつか書きたいと思います。

私の質問は - webob がアップロードされたファイルに使用するので、簡単な方法で (リクエスト全体をエミュレートすることなく) インスタンスcgi.FieldStorageを作成したいと思います。FieldStorage私がそれを行うために必要な最小限のコードは何ですか(「Lorem ipsum」コンテンツを含むテキストファイルのアップロードをエミュレートすることは問題ありません)。それとも、それを嘲笑する方が良い考えですか?

4

3 に答える 3

6

あなたの答えは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)
于 2016-05-16T17:41:36.453 に答える
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             

これは私の単体テストには十分です。

于 2012-08-21T06:00:46.380 に答える