aiohttp.ClientSession() でのアクセスをテスト時にモックしたいときに、 aioresponses というライブラリーが使えます。
Pythonのrequestsライブラリーを簡単にモックできる responses というライブラリーがあるのですが、そのresponses-likeに使えれて便利です。
from aioresponses import aioresponses def test(): with aioresponses() as mocked: moked.get('http://foobar/api', payload={...}) call_function_under_test()
特定のホストへのアクセスは許可する
この aioresponses 、良いのですがデフォルトで全てのリクエストをモックするようです (0.5.2時点) 。 問題としては例えば、 aiohttp でサーバーのテストを書いているとき、そのテストサーバーへのアクセスなどもモックして動作しなくなることです。
そこで、以下のようなpytestのフィクスチャーを書いておくと便利です。 ここでは pytest-aiohttp をインストールしている前提です。
@pytest.fixture def responses(cli): base = cli.make_url('/') with aioresponses(passthrough=[str(base), ...]) as mocked: yield mocked
この例では、テストサーバーのホスト(上記の base
変数の値)へのアクセスを許可しています。
バックエンドのミドルウェアを通してテストする場合などは、 'unix://'
なども許可しておくと良いです。
基本的に全てのアクセスは許可しておいて mock.get(...)
のように追加したURLだけモックするようにしたい気はします。
ともあれ、aiohttp.ClientSessionを使うと aioresponses
を使うと便利です。