Note that there are some explanatory texts on larger screens.

plurals
  1. POTornado testing async requests
    primarykey
    data
    text
    <p>I need an advice regards testing tornado app. For now I just playing with demo chat application, but it looks like real-life problem. </p> <p>In the handler I have:</p> <pre><code>class MessageUpdatesHandler(BaseHandler): @tornado.web.authenticated @tornado.web.asynchronous def post(self): cursor = self.get_argument("cursor", None) global_message_buffer.wait_for_messages(self.on_new_messages, cursor=cursor) def on_new_messages(self, messages): # Closed client connection if self.request.connection.stream.closed(): return self.finish(dict(messages=messages)) class MessageBuffer(object): def __init__(self): .... def wait_for_messages(self, callback, cursor=None): if cursor: new_count = 0 for msg in reversed(self.cache): if msg["id"] == cursor: break new_count += 1 if new_count: callback(self.cache[-new_count:]) return self.waiters.add(callback) def cancel_wait(self, callback): ..... def new_messages(self, messages): logging.info("Sending new message to %r listeners", len(self.waiters)) for callback in self.waiters: try: callback(messages) except: logging.error("Error in waiter callback", exc_info=True) self.waiters = set() self.cache.extend(messages) if len(self.cache) &gt; self.cache_size: self.cache = self.cache[-self.cache_size:] </code></pre> <p>As I metioned full source code is in <a href="https://github.com/facebook/tornado/blob/master/demos/chat/chatdemo.py" rel="nofollow">torndado demos</a></p> <p>In my test I have:</p> <pre><code>@wsgi_safe class MessageUpdatesHandlerTest(LoginedUserHanldersTest): Handler = MessageUpdatesHandler def test_add_message(self): from chatdemo import global_message_buffer kwargs = dict( method="POST", body='', ) future = self.http_client.fetch(self.get_url('/'), callback=self.stop, **kwargs) message = { "id": '123', "from": "first_name", "body": "hello", "html": "html" } global_message_buffer.new_messages([message]) response = self.wait() self.assertEqual(response.code, 200) self.mox.VerifyAll() </code></pre> <p>What happens:</p> <ol> <li>It creates a future object</li> <li>It sends a hello message, in this moment no <code>waiter</code> is registered in <code>MessageBuffer</code> so callback is not called</li> <li>In <code>wait</code> starts IoLoop and makes, a post fetch and <code>waiter</code> becomes registered in <code>MessageBuffer</code></li> <li><p>Callback is never called and my response remains empty, so everything fails with </p> <p>AssertionError: Async operation timed out after 5 seconds</p></li> </ol> <p>What I want it to do:</p> <ol> <li>On post register itself as a waiter</li> <li>Receive some messages</li> <li>Return to me a 200 response</li> </ol> <p>Thank you for your help</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload