运行测试时收到错误RuntimeError:IOLoop已在运行。该怎么办?

时间:2016-11-22 10:32:29

标签: python-3.x tornado pytest

尝试在龙卷风中为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)

1 个答案:

答案 0 :(得分:3)

AsyncHTTPTestCase支持两种模式:使用self.stopself.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。