如何使用Tornado单元测试来测试“上传文件”?

时间:2015-02-13 23:52:44

标签: python unit-testing asynchronous file-upload tornado

我想使用tornado.testing.AsyncHTTPTestCase测试我的网络服务(基于Tornado构建)。它说here使用POST for AsyncHttpClients应如下所示。

from tornado.testing import AsyncHTTPTestCase
from urllib import urlencode

class ApplicationTestCase(AsyncHTTPTestCase):
  def get_app(self):
    return app.Application()

  def test_file_uploading(self):
    url = '/'
    filepath = 'uploading_file.zip' # Binary file
    data = ??????? # Read from "filepath" and put the generated something into "data"
    self.http_client.fetch(self.get_url(url),
                           self.stop,
                           method="POST",
                           data=urlencode(data))
    response = self.wait()
    self.assertEqual(response.code, 302) # Do assertion

if __name__ == '__main__':
  unittest.main()

问题在于我不知道在???????写什么。 Tornado中是否有任何实用程序功能,或者使用Requests之类的替代库是否更好?

P.S。 ...实际上,我已经尝试过使用请求,但我的测试停止了工作,因为我可能没有为异步任务做好事

  def test_file_uploading(self):
    url = '/'
    filepath = 'uploading_file.zip' # Binary file
    files = {'file':open(filepath,'rb')}
    r = requests.post(self.get_url(url),files=files) # Freezes here
    self.assertEqual(response.code, 302) # Do assertion

1 个答案:

答案 0 :(得分:2)

您需要构建一个multipart/form-data请求正文。这在the HTML spec中正式定义。 Tornado目前没有任何辅助函数来生成多部分体。但是,您可以使用requests_toolbelt包中的MultipartEncoder类。只需使用to_string()方法,而不是将编码器对象直接传递给fetch()