2016-05-17 2 views
0

Das ist mein Handler:Wie soll ich eine App Build mit Tornado testen, die Python 3.5 Async verwendet?

class ResourcesHandler(MetaResourceHandler): 
    @tornado.web.asynchronous 
    async def post(self): 
     arguments = self.get_json_arguments(force_presence=True) 
     resources = self._get_collection() 

     try: 
      resource = await resources.insert({**arguments}) 
     except Exception as e: 
      self._exit_exception_500(e) 
     else: 
      self.update_response(
       self._prepare_resource({"_id": resource}) 
      ) 
      self.finish_request(status_code=http_status.HTTP_201) 

Und das ist, wie ich es anfangen:

app = tornado.web.Application(('/resources', ResourcesHandler)) 
app.listen(8888) 
tornado.ioloop.IOLoop.current().start() 

Wenn ich anfangen und versuchen, mit Locke zu testen, es funktioniert aber, wenn ich meine automatisierte Tests ich schreibe mit tornado.testing.AsyncHTTPTestCase hängt es für immer und löst eine Zeitüberschreitung aus. Ich habe bereits versucht, mit Pytest-Tornado zu testen, aber das Verhalten ist das gleiche.

Fehle ich etwas?

Vielen Dank!

Antwort

1

so etwas wie dieses Versuchen:

import unittest 

import tornado.testing 
import tornado.web 

class ResourcesHandler(tornado.web.RequestHandler): 
    async def post(self): 
     self.set_status(201) 
     self.finish('foo') 

class Test(tornado.testing.AsyncHTTPTestCase): 
    def get_app(self): 
     return tornado.web.Application([('/resources', ResourcesHandler)]) 

    def test(self): 
     response = self.fetch('/resources', method='POST', body='') 
     self.assertEqual(response.code, 201) 
     self.assertEqual(response.body, 'Hello, world') 

unittest.main() 

Beachten Sie, dass Sie mit „Asynchron-def“ nicht „asynchron“ Dekorateur benötigen, erkennt Tornado dass Koroutinen asynchron sind. (Das heißt, dass die HTTP-Antwort erst nach dem Beenden der Coroutine abgeschlossen ist.)

Wenn Ihr Test für immer hängt, haben Sie möglicherweise die Anwendung mit einem anderen IOLoop erstellt als der IOLoop von AsyncHTTPTestCase? Um sicherzustellen, dass die Anwendung die richtige Schleife verwendet, erstellen Sie sie in get_app.

+0

Jesse, danke für Ihre schnelle Antwort! Aber selbst nach dem Anwenden der Änderungen, die Sie vorgeschlagen haben, bleibt der '' 'AssertionError: Async-Vorgang nach 5 Sekunden '' bestehen. Würde es Ihnen etwas ausmachen, sich mein [Projekt] (https://github.com/felippemr/resistance) anzusehen? Danke nochmal! –

+0

Entschuldigung, ich habe einen kurzen Blick auf Ihr Projekt geworfen und kann nicht erkennen, warum Ihr Test blockiert würde. –

+0

Danke Jesse! Ich werde versuchen, eine Lösung zu finden! –

1

Jesses Code funktionierte gut für mich. Wenn Sie weiterhin Probleme haben, versuchen Sie, Ihren Tornado auf die neueste Version zu aktualisieren. Sie können es nur eingeben:

pip3 install --upgrade tornado 
Verwandte Themen