与网络插座旋风单元测试 - 怎么样栈方面?(Tornado unit test with web s

2019-08-06 01:53发布

我一直在使用龙卷风服务器了一会儿,我必须说,我喜欢它。 我有一个处理网络套接字和HTTP请求龙卷风服务器(运行在python3.2)。 我想要做的就是写一些单元测试(使用网络插槽),ws2py(它实现了WS客户端与龙卷风IOLoop使用)。 我看到龙卷风有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与网络插口,客户是没有问题的,我可以给,没有问题接收消息。

我想我需要做的就是通过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对象作为响应,但其数据字段是None尽管有些数据已经被客户接受。 如果我看看到AsyncTestCase,它调用回调之前,该对象中有一些数据,它会消失,当它作为等待的返回值被传递莫名其妙的地方()。

我看到有一个神秘的东西在龙卷风称为stack_context,有东西与我的问题呢?

Answer 1:

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

所以,只要调用你的回调传球message.data而非完整的message 。 像那样:

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


文章来源: Tornado unit test with web sockets - what about stack context?