python-3.x - 如何通过文件上传创建龙卷风单元测试?
问题描述
我正在尝试创建一个需要上传 CSV 文件的单元测试。这是我想做的一个片段,
from tornado.testing import AsyncHTTPTestCase
import json
class TestCSV(AsyncHTTPTestCase):
def test_post_with_duplicates_csv_returns_400(self, *args, **kwargs):
dup_file = open("test.csv", 'r')
body = {'upload': dup_file.read()}
request_config = {
'method': 'POST',
'headers': {
'Content-Type': 'application/json',
'Origin': 'localhost'
},
'body': json.dumps(payload)
}
response = self.fetch('http://localhost/file_upload', **request_config)
self.assertEqual(response.code, 400)
实际代码会像这样查找上传的文件,
...
file = self.request.files['upload'][0]
...
这将返回 500 状态代码和以下消息,
HTTPServerRequest(protocol='http', host='127.0.0.1:46243', method='POST', uri='/v2/files/merchants/MWBVGS/product_stock_behaviors', version='HTTP/1.1', remote_ip='127.0.0.1')
Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/tornado/web.py", line 1699, in _execute
result = await result
File "/usr/local/lib/python3.6/site-packages/tornado/gen.py", line 191, in wrapper
result = func(*args, **kwargs)
File "/usr/app/src/handlers/merchants.py", line 463, in post
file = self.request.files['upload'][0]
KeyError: 'upload'
有人可以帮我解释为什么没有检测到文件吗?
环境:Python 3.6,龙卷风
解决方案
您将文件编码为 JSON,但这些request.files
字段用于 HTML 分段上传。您需要决定要使用哪种格式(除了这些格式之外,您通常可以直接将文件作为 HTTP PUT 正文上传)并在代码和测试中使用相同的格式。
Tornado 目前不提供任何用于生成分段上传的工具,但 python 标准库的email.mime
包提供。
推荐阅读
- r - 使用 facet_zoom 放大时间序列图
- python - sklearn LinearDiscriminantAnalysis 中的先验顺序
- amazon-web-services - Serverless 创建的 AWS Cognito 不发送确认电子邮件
- flutter - Flutter TextFormFeild 问题
- reactjs - 不确定我在使用 CORS、woocommerce API 和单独的 React 网站时做错了什么
- java - java.io.IOException:http1_0 内容,收到的字节数:112
- .htaccess - htaccess:如果 webp 存在,则提供 webp 图像而不是 jpg 或 png 导致 404
- python - 为什么没有设置和验证自定义用户密码?
- python - 在python中使用openCV逐帧处理视频
- postgresql - MacOS 的 PostgreSql 安装问题