2012-10-09 34 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) 

希望这将帮助你。