gpt4 book ai didi

unit-testing - 使用 AsyncHttpTastCase 测试异步方法时, Tornado 被阻止

转载 作者:行者123 更新时间:2023-12-04 04:42:21 26 4
gpt4 key购买 nike

我是 python 和 tornado 的新手,并尝试使用 @tornado.web.asynchronous 为 GET 方法编写单元测试。但它始终被阻止并输出以下错误消息:

Failure
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/case.py", line 327, in run
testMethod()
File "/Developer/PycharmProjects/CanMusic/tornadotestcase.py", line 19, in test_gen
response = self.fetch(r'/gen')
File "/Developer/python/canmusic_env/lib/python2.7/site-packages/tornado/testing.py", line 265, in fetch
return self.wait()
File "/Developer/python/canmusic_env/lib/python2.7/site-packages/tornado/testing.py", line 205, in wait
self.__rethrow()
File "/Developer/python/canmusic_env/lib/python2.7/site-packages/tornado/testing.py", line 149, in __rethrow
raise_exc_info(failure)
File "/Developer/python/canmusic_env/lib/python2.7/site-packages/tornado/testing.py", line 186, in timeout_func
timeout)
AssertionError: Async operation timed out after 5 seconds

我写了下面的代码作为例子。将它作为单元测试( Nose )运行,得到上面的错误。当它作为一个独立的应用程序运行并通过浏览器访问 url 时,它工作正常。我还尝试异步回调版本(没有@tornado.gen.engine 和 yield),结果相同。

为什么?我错过了什么?
import tornado.web, tornado.gen, tornado.httpclient, tornado.testing

class GenHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
@tornado.gen.engine
def get(self):
http = tornado.httpclient.AsyncHTTPClient()
response = yield tornado.gen.Task(http.fetch, 'http://www.google.com')
self.finish()

# code for run nose test
class GenTestCase(tornado.testing.AsyncHTTPTestCase):
def get_app(self):
return tornado.web.Application([(r'/gen', GenHandler)])
def test_gen(self):
response = self.fetch(r'/gen')
assert response.code == 200

# code for run standalone
application = tornado.web.Application([(r'/gen', GenHandler),])
if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()

最佳答案

发生的情况是 RequestHandler 中的 AsyncHTTPClient 正在不同的 IOLoop 上运行,该 IOLoop 从未启动。

你可以通过覆盖 get_new_ioloop 来解决这个问题。在您的测试用例中:

def get_new_ioloop(self):
return tornado.ioloop.IOLoop.instance()

这有点奇怪,但它的发生是因为每个 AsyncTestCase/AsyncHTTPTestCase 方法都会生成它自己的 IOLoop,以便更好地隔离。

关于unit-testing - 使用 AsyncHttpTastCase 测试异步方法时, Tornado 被阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14688042/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com