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