我已经使用 Tornado 服务器一段时间了,我不得不说我喜欢它。我有一个处理 Web 套接字和 http 请求的龙卷风服务器(在 python3.2 上运行)。我想要做的是用 ws2py(它实现一个 ws 客户端以与 tornado IOLoop 一起使用)编写一些单元测试(使用 web 套接字)。我看到龙卷风有 AsyncTestCase 类,它看起来很有趣,特别是在与文档中所述的 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,这和我的问题有关吗?