Python 使用web套接字的Tornado单元测试-堆栈上下文如何?

Python 使用web套接字的Tornado单元测试-堆栈上下文如何?,python,unit-testing,tornado,Python,Unit Testing,Tornado,我使用tornado服务器已经有一段时间了,我不得不说我喜欢它。 我有一个tornado服务器(在python3.2上运行),它处理web套接字和http请求。 我想做的是用ws2py编写一些单元测试(使用web套接字)(它实现了一个ws客户机,用于tornado IOLoop)。我看到tornado有一个AsyncTestCase类,它看起来非常有趣,特别是当与AsyncHTTPClient一起使用时,如其: 我想将AsyncTestCase与web套接字一起使用, 客户端不是问题,我可以毫无

我使用tornado服务器已经有一段时间了,我不得不说我喜欢它。 我有一个tornado服务器(在python3.2上运行),它处理web套接字和http请求。 我想做的是用ws2py编写一些单元测试(使用web套接字)(它实现了一个ws客户机,用于tornado IOLoop)。我看到tornado有一个AsyncTestCase类,它看起来非常有趣,特别是当与AsyncHTTPClient一起使用时,如其:

我想将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()
这是我的web套接字客户端:

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
对象作为响应,但是它的数据字段it
None
,尽管客户端已经收到了一些数据。如果我查看一下AsyncTestCase,在它调用回调之前,该对象中有一些数据,当它作为wait()的返回值传递时,这些数据不知何故消失了


我看到龙卷风中有一个神秘的东西叫做stack_context,这与我的问题有关吗?

问题是消息“data”包含在
消息的
data
属性中。调用
接收的\u message
后,
message.data
将重置为无()

因此,只需通过传递
message.data
而不是完整的
消息来调用回调。就像这样:

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

很有效,非常感谢!!我记不清我到底在做什么,但它会打印出信息。
def received_message(self, message):
    """Received a message"""
    self.close()
    if self._callback:
       self._callback(message.data)