3

私はトルネード サーバーをしばらく使用していますが、気に入っています。Webソケットとhttpリクエストを処理するトルネードサーバー(python3.2で実行)があります。私がやりたいことは、ws2py (tornado IOLoop で使用する ws クライアントを実装する) を使用して (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)

Web ソケットで 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が、そのデータ フィールドはそれを受け取ります。NoneAsyncTestCase を調べると、コールバックを呼び出す前に、そのオブジェクトにはいくつかのデータが含まれており、wait() の戻り値として渡されると、どこかで消えてしまいます。

トルネードには stack_context と呼ばれる神秘的なものがあるようですが、それは私の問題と関係がありますか?

4

1 に答える 1

4

data問題は、 の属性に「データ」というメッセージが含まれていることですmessage。がreceived_message呼び出されると、message.dataNone にリセットされます ( 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)
于 2013-03-18T15:04:58.190 に答える