【问题标题】:How to create a tornado unit test with file upload?如何通过文件上传创建龙卷风单元测试?
【发布时间】:2020-08-17 08:29:14
【问题描述】:

我正在尝试创建一个需要上传 CSV 文件的单元测试。这是我正在尝试做的一个 sn-p,

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,龙卷风

【问题讨论】:

    标签: python-3.x unit-testing tornado


    【解决方案1】:

    您将文件编码为 JSON,但 request.files 字段用于 HTML 分段上传。您需要决定要使用哪种格式(除了这些格式之外,您通常可以直接将文件作为 HTTP PUT 正文上传)并在代码和测试中使用相同的格式。

    Tornado 目前不提供任何生成分段上传的工具,但 python 标准库的 email.mime 包提供。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多