使用Web套接字进行龙卷风单元测试 - 堆栈上下文怎么样?

时间:2013-01-08 13:13:27

标签: python unit-testing tornado

我已经使用龙卷风服务器一段时间了,我不得不说我喜欢它。 我有一个龙卷风服务器(运行在python3.2上),处理Web套接字和http请求。 我想要做的是写一些单元测试(使用web套接字)和ws2py(它实现了一个与龙卷风IOLoop一起使用的ws客户端)。我看到tornado有AsyncTestCase类,它看起来很有趣,尤其是当它与doc中所述的AsyncHTTPClient一起使用时:

class MyTestCase2(AsyncTestCase):
    def test_http_fetch(self):
        client = AsyncHTTPClient(self.io_loop)
        client.fetch("http://www.tornadoweb.org/", self.stop)
        response = self.wait()
        # Test contents of response
        self.assertIn("FriendFeed", response.body)

我想将AsyncTestCase与web套接字一起使用, 客户端不是问题,我可以毫无问题地发送和接收消息。

我想我要做的是将self.stop作为回调传递给客户端,以便通过调用上面示例中的wait()来检索收到的消息。但不知怎的,这不起作用,这就是我所拥有的:

class SQLRequests(AsyncTestCase):
    """Tests sql requests"""

    def test_sql_req_1(self):
        """first test function"""
        client = AsyncWSClient(httpBaseUrl, self.io_loop)
        client.sendMessage('some_message', self.stop)

        response = self.wait()
        if response.data:
            print('got %s' % str(response.data))
            # some test
            self.assertTrue(True)


if __name__ == '__main__':
    unittest.main()

这是我的网络套接字客户端:

class AsyncWSClient(TornadoWebSocketClient):
"""
Asynchronous web socket client based on ws4py's tornadoclient
Sends a message and calls callback with received message
"""
def __init__(self, url, ioLoop=None, **kwargs):
    TornadoWebSocketClient.__init__(self, url, io_loop=ioLoop, **kwargs)
    self._callback = None
    self._message = None

def opened(self):
    """called when web socket opened"""
    self.send(self._message, binary=False)      

def received_message(self, message):
    """Received a message"""
            self.close()
    if self._callback:
        self._callback(message)

def sendMessage(self, message, callback):
    """Connects and sends message when connected"""
    self._message = message
    self._callback = callback
    self.connect()

我确实收到一个ws2py.messaging.TextMessage对象作为响应,但它的数据字段为None,尽管客户端已收到一些数据。如果我查看AsyncTestCase,在它调用回调之前,该对象中有一些数据,当它作为wait()的返回值传递时会以某种方式消失。

我看到在龙卷风中有一个神秘的东西叫做stack_context,那与我的问题有什么关系?

1 个答案:

答案 0 :(得分:4)

问题是“数据”消息包含在data的{​​{1}}属性中。调用message后,received_message将重置为无(https://github.com/Lawouach/WebSocket-for-Python/blob/master/ws4py/websocket.py#L369)。

因此,只需将您的回调称为message.data而不是完整的message.data。像那样:

message