私はユニットテストをしたいasyncioベースのクラスを持っています。 tornado.testing.AsyncTestCase
を使用すると、これは非常にうまく簡単に機能します。しかし、私のクラスの特定のメソッドの1つはasyncio.ensure_future
を使って別のメソッドの実行をスケジュールします。これはAsyncTestCase
で決して終了しません。デフォルトのテストランナーは、asyncioイベントループではなく、竜巻KQueueIOLoop
イベントループを使用するためです。asyncioイベントループを使用してtornado.testing.AsyncTestCaseを実行します。
class TestSubject:
def foo(self):
asyncio.ensure_future(self.bar())
async def bar(self):
pass
class TestSubjectTest(AsyncTestCase):
def test_foo(self):
t = TestSubject()
# here be somewhat involved setup with MagicMock and self.stop
t.foo()
self.wait()
$ python -m tornado.testing baz.testsubject_test
...
[E 160627 17:48:22 testing:731] FAIL
[E 160627 17:48:22 base_events:1090] Task was destroyed but it is pending!
task: <Task pending coro=<TestSubject.bar() running at ...>>
.../asyncio/base_events.py:362: RuntimeWarning: coroutine 'TestSubject.bar' was never awaited
どのように私は私のタスクが実際に実行されることを確認するためにテストを実行するためにさまざまなイベントループを使用することができますか?また、実装イベントをループに依存せず相互互換にするにはどうすればよいですか?