3

ページ上のフォームから受け取った写真のアップロードを担当する機能の単体テストの作成に苦労しています。

主な問題は、ダミー リクエストのポスト パラメータに画像を追加し、それを関数に渡す方法がわからないことです。

これが私がテストしようとしているコードです。

ありがとう

@view_config(route_name='profile_pic')
def profilePictureUpload(request):
 if 'form.submitted' in request.params:
    #max picture size is 700kb
    form = Form(request, schema=PictureUpload)

    if request.method == 'POST' and form.validate():
        upload_directory = 'filesystem_path'
        upload = request.POST.get('profile')
        saved_file = str(upload_directory) + str(upload.filename)

        perm_file = open(saved_file, 'wb')
        shutil.copyfileobj(upload.file, perm_file)

        upload.file.close()
        perm_file.close()

    else:
        log.info(form.errors)
 redirect_url = route_url('profile', request)
 return HTTPFound(location=redirect_url)
4

1 に答える 1

10

クライアントから提供された名前でファイルシステム上に実際にファイルを作成することは、本当に悪い習慣です (そして潜在的なセキュリティ ホールupload.filename)。

それが邪魔にならないように、私はあなたのコードであなたがrequest.paramsrequest.POST.get('profile')upload.fileおよびを呼び出しているのを見ますupload.filename。これらすべてをモックアウトして、最終的に に StringIO オブジェクトを提供できますupload.file

class MockCGIFieldStorage(object):
    pass

upload = MockCGIFieldStorage()
upload.file = StringIO('foo')
upload.filename = 'foo.html'

request = DummyRequest(post={'profile': upload, 'form.submitted': '1'})

response = profilePictureUpload(request)
于 2012-06-20T05:35:34.243 に答える