我一直在GOOGLE上搜索並詢問IRC無濟於事。 Cyclone應該是Twisted的類似Tornado的協議。但是,Cyclone版本庫中沒有測試,也沒有人寫過如何將tornado.testing.AsyncHTTPTestCase
測試轉換爲針對Cyclone編寫的代碼。我如何以龍捲風的風格編寫測試Cyclone?
- 如何啓動服務器以測試Web界面?
self.fetch()
在哪裏?- Cyclone中的文檔描述瞭如何轉換現有的Tornado應用程序?
我一直在GOOGLE上搜索並詢問IRC無濟於事。 Cyclone應該是Twisted的類似Tornado的協議。但是,Cyclone版本庫中沒有測試,也沒有人寫過如何將tornado.testing.AsyncHTTPTestCase
測試轉換爲針對Cyclone編寫的代碼。我如何以龍捲風的風格編寫測試Cyclone?
self.fetch()
在哪裏?不幸的是,目前沒有什麼像旋風式的tornado.testing.AsyncHTTPTestCase
。你最好的選擇是使用Twisted Trial編寫單元測試。一種(稍微笨拙)的方法將在您的測試用例中明確地調用setUp
方法中的self.listener = reactor.listenTCP(<someport>, YourCycloneApplication())
,並且在tearDown
方法中調用self.listener.stopListening()
。
然後,在您的測試方法中,您可以使用cyclone.httpclient.fetch
來獲取頁面。 這遠非理想。但截至目前,這是唯一的出路。
這是目前我們使用的測試我們cylcone處理像我們與龍捲風做了什麼:
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)
希望這將幫助你。