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