0

我正在尝试为 tornado_json Web 应用程序设置单元测试。我正在尝试测试一个 post 处理程序,但是我失败了,因为该fetch方法似乎返回了一个 _asyncio.Future 对象,该对象似乎永远不会完成/具有结果集。我试图发布代码摘要,目前我只是返回 ['test'] 项目。我查看了https://github.com/tornadoweb/tornado/issues/1154以及 tornado 文档。听起来我需要 self.stop 或 self.wait() 来完成任务,但我还没有弄清楚如何让它工作,或者这是否是解决方案。任何帮助将不胜感激。

@schema.validate( input_schema={ "type": "object", "properties": { "path": {"type": "string"} }, "required": ["path"] }, output_schema={ "type": "array", "items": { "properties": {"type": "string"} } } ) @coroutine def post(self): attributes = dict(self.body) path = attributes["path"] response = ["test"] return response

@gen_test def test_POST_method(self):
body = json.dumps({'path': 'bin'}) self.http_client.fetch(self.get_url('/api/listmyfiles'), method="POST", body=body ) response = self.wait() print(response.result()))

我得到的错误是: asyncio.base_futures.InvalidStateError: Result is not set.

4

1 回答 1

2

AsyncHTTPTestCase有几种不同的操作模式,不能混用。

  1. @gen_test: 与await self.http_client.fetch(self.get_url(...)):一起使用

    @gen_test
    async def test_post_method(self):
        response = await self.http_client.fetch(self.get_url(...))
    
  2. self.stop/self.wait是一个较旧的接口,大部分(但不完全)被弃用。 AsyncHTTPClient在 Tornado 6.0 中不会(很容易)与这个接口兼容,所以我不会在这里展示一个例子。

  3. self.fetchhttp_client.fetch是一种简写方法,它结合了对and的调用,self.get_url并在幕后使用stop/ wait(因此它与 不兼容@gen_test):

    def test_post_method(self):
        response = self.fetch('/api/listmyfiles')
    

如果您正在做的唯一异步操作是 HTTP 获取,您可以使用self.fetch. 如果您需要做任何其他异步操作,请使用gen_test并避免使用 stop/wait/self.fetch 方法。

于 2018-11-14T14:17:51.073 回答