尝试在龙卷风中为web auth编写测试。 但收到错误:
C:\python3\lib\site-packages\tornado\testing.py:402: in fetch
return self.wait()
C:\python3\lib\site-packages\tornado\testing.py:323: in wait
self.io_loop.start()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <tornado.platform.select.SelectIOLoop object at 0x00B73B50>
def start(self):
if self._running:
raise RuntimeError("IOLoop is already running")
E RuntimeError:IOLoop已在运行
不知道该怎么做。需要帮助。有代码:
import pytest
import tornado
from tornado.testing import AsyncTestCase
from tornado.testing import AsyncHTTPTestCase
from tornado.httpclient import AsyncHTTPClient
from tornado.httpserver import HTTPServer
from tests.commons.testUtils import TestUtils
from tornado.web import Application, RequestHandler
import urllib.parse
from handlers.authentication.restAuthHandlers import RESTAuthHandler
import app
class TestRESTAuthHandler(AsyncHTTPTestCase):
def get_app(self):
return app
@tornado.testing.gen_test
def test_http_fetch_login(self):
data = urllib.parse.urlencode(dict(username='user', password='123456'))
response = self.fetch("http://localhost:8888/web/auth/login", method="POST", body=data)
self.assertIn('http test', response.body)
答案 0 :(得分:3)
AsyncHTTPTestCase支持两种模式:使用self.stop
和self.wait
的传统/传统模式,以及使用@gen_test
的较新模式。为一种模式设计的功能在另一种模式下不起作用; self.fetch
专为前一种模式而设计。
您可以通过两种方式编写此测试。首先,使用self.fetch,就像你编写它一样,但删除了@gen_test
装饰器。其次,这是@gen_test
的版本:
@tornado.testing.gen_test
def test_http_fetch_login(self):
data = urllib.parse.urlencode(dict(username='user', password='123456'))
response = yield self.http_client.fetch("http://localhost:8888/web/auth/login", method="POST", body=data)
self.assertIn('http test', response.body)
区别在于使用yield self.http_client.fetch
代替self.fetch
。 @gen_test
版本大多更“现代”,并且允许您以与编写应用程序相同的方式编写测试,但它有一个很大的缺点:您可以调用self.fetch('/')
并自动填写主机和为测试启动的服务器的端口,但在self.http_client.fetch
中,您必须构造完整的URL。