在self.fetch之外,龙卷风的AsyncHttpTestCase不可用

时间:2014-05-22 06:55:30

标签: testing tornado python-unittest

我有一个AsyncHttpTestCase,我想从self.fetch以外的方法访问它。具体来说,我有一个SockJS处理程序,我希望sockjs-client也可以附加到我的测试中。

我发现即使self.get_url('/foo')返回了有效的网址,该网址也不会响应self.fetch()以外的任何内容。是什么给了什么?

AsyncHttpTestCase是不可能的?这样做的最佳模式是什么?

这是tests.py

import urllib2

from tornado.httpclient import AsyncHTTPClient 
import tornado.testing
from tornado.testing import AsyncTestCase, AsyncHTTPTestCase

from app import DebugApp

class TestDebug(AsyncHTTPTestCase):
    def get_app(self):
        return DebugApp()

    def test_foo(self):
        response = self.fetch('/foo')
        print response.body
        assert response.body == 'derp'

    def test_foo_from_urllib(self):
        response = urllib2.urlopen(self.get_url('/foo'), None, 2)
        print response
        assert response.body == 'derp'

    def runTest(self):
        pass

app.py

import tornado.httpserver
import tornado.ioloop
import tornado.web
from tornado.options import options

class FooHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("derp")

url_patterns = [
    (r"/foo", FooHandler),
]

class DebugApp(tornado.web.Application):
    def __init__(self):
        tornado.web.Application.__init__(self, url_patterns, debug=True, xsrf_cookies=False)

def main():
    app = DebugApp()
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(6006)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()

runtest.py

#!/usr/bin/env python

import unittest
from os import path
import sys

import tornado.testing

PROJECT_PATH = path.dirname(path.abspath(__file__))
sys.path.append(PROJECT_PATH)


def all():
    suite = unittest.defaultTestLoader.discover('./', 'tests.py', path.dirname(path.abspath(__file__)))
    print suite
    return suite

if __name__ == '__main__':
    # Print a nice message so that we can differentiate between test runs
    print ''
    print '%s %s' % ('Debug app', '0.1.0')
    print '\033[92m' + '-------------- Running Test Suite --------------' + '\033[0m'
    print ''

    tornado.testing.main()

1 个答案:

答案 0 :(得分:2)

问题是当你调用urlopen时IOLoop没有运行(并且它不能,因为urlopen是一个阻塞函数)。您必须运行IOLoop(使用@gen_testself.wait()或通过self.fetch()等方法间接运行)以便服务器响应,并且您只能通过非阻塞功能与其进行交互(或者如果必须使用像urlopen这样的阻塞函数,请在单独的线程中运行它们。