Aiohttp: 実際のアプリでクライアントループエラーをテストする

作成日 2018年08月17日  ·  4コメント  ·  ソース: aio-libs/aiohttp

短編小説

推奨されるテストパターンでは、アプリコードの定型的な複製が必要であり、アプリを直接テストすることは示されていません。

https://docs.aiohttp.org/en/stable/testing.html#pytest

期待される動作

アプリをテストするために、アプリモジュールをtest_clientに直接渡すことができるはずです。

実際の動作

ドキュメントには、各テストの前に、ハンドラーからその場でアプリを構築する方法が示されています。 実際のapptest_client app直接渡すことは、最初は正常に機能し、その後「RuntimeError:web.Applicationインスタンスが異なるループで初期化されました」で失敗します。

再現する手順

# handler.py

async def foo():
    return 'foo'
# app.py

from aiohttp import web
from .handler import foo

app = web.Application()
app.add_routes([web.get('/foo/', foo)])
# test.py

from .app import app

async def test_foo_status(test_client):
    response = await client.get('/foo/')
    assert response.status == 200

async def test_foo_body(test_client):
    response = await client.get('/foo/')
    body = await response.text()
    assert body == 'foo'

あなたの環境

  • OS:Ubuntu 18.04
  • Python:3.6.5
  • aiohttp:3.3.2

回避策

今のところ、ソースコードを調べてエラーの原因を特定することで、この問題をハッキングしました。

        if self._loop is not None and self._loop is not loop:
            raise RuntimeError(
                "web.Application instance initialized with different loop")

https://github.com/aio-libs/aiohttp/blob/e561eaa/aiohttp/web_app.py#L134

このコードが必要な理由はすぐにはわかりません。 gitの履歴にコンテキストが見つかりませんでした。 テストクリーンアップ方法でapp._loop = Noneを設定すると、悪影響を与えることなく問題を回避できるようです。 このコードは実際に必要ですか? この修正をtest_client統合できますか?

outdated

最も参考になるコメント

Applicationはステートフルオブジェクトであり、ユニットテストスイートからのテストごとに再作成する必要があります。
アプリケーションの寿命は、イベントループの寿命よりも短くする必要があります。

ヒント: app.appasync def app.make_app()コルーチンに置き換えて、呼び出しごとに新しいアプリを返します。

全てのコメント4件

Applicationはステートフルオブジェクトであり、ユニットテストスイートからのテストごとに再作成する必要があります。
アプリケーションの寿命は、イベントループの寿命よりも短くする必要があります。

ヒント: app.appasync def app.make_app()コルーチンに置き換えて、呼び出しごとに新しいアプリを返します。

def make_app()app.py追加しますか? それは理にかなっている。

FWIWトルネードは、最初の例でmake_app()パターンを促進します。 テストファイルでアプリをモックすることは、ドキュメントが宣伝するのに適したパターンではないと思います。

http://www.tornadoweb.org/en/stable/#hello -world

正直なところ、 aiohttpオブジェクトをモックするのは良いパターンではないと思います

このスレッドは、閉じられた後、最近のアクティビティがないため、自動的にロックされています。 関連するバグについては、[新しい問題]を開いてください。
この議論で重要なポイントがあると思われる場合は、それらの抜粋をその[新刊]に含めてください。

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

Codeberg-AsGithubAlternative-buhtz picture Codeberg-AsGithubAlternative-buhtz  ·  3コメント

alxpy picture alxpy  ·  5コメント

ZeusFSX picture ZeusFSX  ·  5コメント

AtomsForPeace picture AtomsForPeace  ·  5コメント

asvetlov picture asvetlov  ·  4コメント