pytestで、requests.post()をTrue返すだけの雑なMockを作っていたのだが、コード内でステータスコードの検証をするときにさすがにそれでは困った。ここでは res = requests.post()でres.status_codeが返ってくるような感じにしたい。
例によってChatGPT-4に聞いてできたので、記事としてまとめてもらう。
Pythonのユニットテストでは、外部のAPIとの通信を模倣(モック)する必要があります。この記事では、特にrequestsライブラリを使ったHTTPリクエストとそのレスポンスのステータスコードをモックする方法について説明します。
まずは、モックを作成するために必要なpytestとmockerをインポートしましょう。
import pytest
import requests
次に、requests.Responseオブジェクトのモックを作成します。今回はステータスコードのみを模倣するため、status_code属性だけを持つ簡単なクラスを作成します。
class MockResponse:
def __init__(self):
self.status_code = 200
そして、実際にrequests.postをモックするためのテストフィクスチャを作ります。このフィクスチャは、requests.postが呼び出されたときに、上で作成したMockResponseオブジェクトを返すように設定します。
@pytest.fixture(autouse=True)
def mock_requests_post(mocker):
mocker.patch("requests.post", return_value=MockResponse())
これにより、テスト中のすべてのrequests.post呼び出しは、ステータスコードが200のレスポンスを返すようになります。
この例では最もシンプルなケースを扱いましたが、より複雑なテストケースではMockResponseクラスに更なる機能を追加することが考えられます。例えば、レスポンスボディを模倣するためにtextやjsonメソッドを追加するといったことがあります。
以上で、requestsライブラリのHTTPリクエストとそのレスポンスのステータスコードをモックする方法の説明を終えます。テストの中で外部APIとの通信を模倣するために、このテクニックを活用してみてください。
寸評
動作確認済み。こういうの調べると地味に時間かかるから助かる。
以下質問。
- pythonのrequestsでstatus_codeを調べたい
- response["status_code"]でもいい?
- 以下はpytestでrequestsをmockにしてるんだけど、return_valueでresponse.status_codeが200となるようにできないかな(コード)
- いけた。ありがとう。 備忘録にしたい。pytestにおいて、Mockでrequestsのresponseでstatus_codeを返すことに主眼を置いた記事を書いて