наблюдал ajdavis @ pycon2015 о тестировании асинхронных приложениях, как показано ниже: http://pyvideo.org/video/3419/eventually-correct-testing-async-appsExceptionStackContext для тестирования Торнадо асинхронного приложения
У меня есть вопрос об использовании ExceptionStackContext. В презентации, он используется, как показано ниже:
import unittest
from tornado.stack_context import ExceptionStackContext
from tornado.ioloop import IOLoop
class TestAsync(unittest.TestCase):
def test_delay(self):
io_loop = IOLoop.current()
def handle_exception(typ, val, tb):
self.failure = (typ, val, tb)
io_loop.stop()
def done():
self.assertAlmostEqual(time.time() - start, 2)
self.stop()
with ExceptionStackContext(handle_exception):
delay(3, done) # fail the assert
io_loop.start()
запустить этот тест, io_loop не остановится. потому что handle_exception не вызывается.
мой метод асинхронной delay
является:
import threading
import time
def delay(delay_seconds, callback):
def wrap():
time.sleep(delay_seconds)
callback()
t = threading.Thread(target=wrap)
t.daemon = True
t.start()
так я думаю, он должен ExceptionStackContext должен обернуть done()
, как показано ниже:
def callback():
with ExceptionStackContext(handle_exception):
done()
delay(2, callback)
io_loop.start()
это путь райт использовать ExceptionStackContext?
, кстати, ExceptionStackContext в tornado.testing.AsyncTestCase бесполезно на самом деле:
def run(self, result=None):
with ExceptionStackContext(self._handle_exception):
super(AsyncTestCase, self).run(result)
super(AsyncTestCase, self).run(result)
не бросает вверх AssertException.
надстройки метод асинхронной '' delay'', что я думаю, что это проблема, по сравнению с тем, от ajdavis – WangST