我一直在谷歌搜索并询问 IRC 无济于事。Cyclone应该是 Twisted 的类似 Tornado 的协议。但是,Cyclone 存储库中没有测试,也没有人写过如何将tornado.testing.AsyncHTTPTestCase
测试转换为针对 Cyclone 编写的练习代码。
- 如何启动服务器来测试 Web 界面?
- 在哪里
self.fetch()
? - Cyclone 中描述如何转换现有 Tornado 应用程序的文档在哪里?
不幸的是,目前没有像tornado.testing.AsyncHTTPTestCase
旋风这样的东西。你最好的选择是使用Twisted Trial来编写单元测试。一种(有点笨拙)self.listener = reactor.listenTCP(<someport>, YourCycloneApplication())
的方法是在setUp
测试用例中显式调用方法并调用self.listener.stopListening()
该tearDown
方法。
然后,在您的测试方法中,您可以使用它cyclone.httpclient.fetch
来获取页面。这远非理想。但就目前而言,这是唯一的出路。
这是我们目前用来测试 cylcone 处理程序的内容,就像我们对 tornado 所做的那样:
from twisted.trial.unittest import TestCase
from twisted.internet import defer, reactor
from cyclone import httpclient
# copied from tornado
_next_port = 10000
def get_unused_port():
"""Returns a (hopefully) unused port number."""
global _next_port
port = _next_port
_next_port = _next_port + 1
return port
class TxTestCase(TestCase):
def get_http_port(self):
"""Returns the port used by the HTTPServer.
A new port is chosen for each test.
"""
if self.__port is None:
self.__port = get_unused_port()
return self.__port
def setUp(self, *args, **kwargs):
self.__port = None
self._app = self.get_app()
self._listener = None
if self._app:
self._listener = reactor.listenTCP(self.get_http_port(), self._app)
return TestCase.setUp(self, *args, **kwargs)
def get_app(self):
return None
def tearDown(self):
if self._listener:
self._listener.stopListening()
@defer.inlineCallbacks
def fetch(self, url, *args, **kwargs):
response = yield httpclient.fetch('http://localhost:%s%s'%(self.get_http_port(), url), *args, **kwargs)
defer.returnValue(response)
这样,您就可以找回fetch
方法;)
并且不再需要使用试用版。
这是一个使用示例:
from twisted.internet import defer
class Test(TxTestCase):
def get_app(self):
return MyApplication()
@defer.inlineCallbacks
def some_test_method(self):
res = yield self.fetch('/path/to/resource')
self.assertEquals(200, res.code)
希望对您有所帮助。