如何以Tornado的风格编写Cyclone测试?

时间:2012-10-09 20:34:44

标签: python unit-testing migration tornado cyclone

我一直在谷歌搜索并要求IRC无济于事。 Cyclone应该是Twisted的类似龙卷风的协议。但是,Cyclone存储库中没有测试,没有人写过如何将tornado.testing.AsyncHTTPTestCase测试转换为针对Cyclone编写的练习代码。

  1. 如何启动服务器来测试Web界面?
  2. self.fetch()
  3. 在哪里?
  4. Cyclone中的文档在哪里描述如何转换现有的Tornado应用程序?

2 个答案:

答案 0 :(得分:2)

不幸的是,目前在旋风中没有像tornado.testing.AsyncHTTPTestCase那样的东西。您最好的选择是使用Twisted Trial来编写单元测试。一个(略微克服)方法将在您的测试用例中的self.listener = reactor.listenTCP(<someport>, YourCycloneApplication())方法中明确调用setUp,并在self.listener.stopListening()方法中调用tearDown

然后,在测试方法中,您可以使用cyclone.httpclient.fetch来获取页面。 这远非理想。但截至目前,这是唯一的出路。

答案 1 :(得分: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)

希望能帮助你。