2012-10-09 109 views
4

我一直在GOOGLE上搜索並詢問IRC無濟於事。 Cyclone應該是Twisted的類似Tornado的協議。但是,Cyclone版本庫中沒有測試,也沒有人寫過如何將tornado.testing.AsyncHTTPTestCase測試轉換爲針對Cyclone編寫的代碼。我如何以龍捲風的風格編寫測試Cyclone?

  1. 如何啓動服務器以測試Web界面?
  2. self.fetch()在哪裏?
  3. Cyclone中的文檔描述瞭如何轉換現有的Tornado應用程序?

回答

2

不幸的是,目前沒有什麼像旋風式的tornado.testing.AsyncHTTPTestCase。你最好的選擇是使用Twisted Trial編寫單元測試。一種(稍微笨拙)的方法將在您的測試用例中明確地調用setUp方法中的self.listener = reactor.listenTCP(<someport>, YourCycloneApplication()),並且在tearDown方法中調用self.listener.stopListening()

然後,在您的測試方法中,您可以使用cyclone.httpclient.fetch來獲取頁面。 這遠非理想。但截至目前,這是唯一的出路。

2

這是目前我們使用的測試我們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) 

希望這將幫助你。