MENU

PytestとMockを使ってRequestsのResponseのStatus Codeをテストする

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クラスに更なる機能を追加することが考えられます。例えば、レスポンスボディを模倣するためにtextjsonメソッドを追加するといったことがあります。

以上で、requestsライブラリのHTTPリクエストとそのレスポンスのステータスコードをモックする方法の説明を終えます。テストの中で外部APIとの通信を模倣するために、このテクニックを活用してみてください。

寸評

動作確認済み。こういうの調べると地味に時間かかるから助かる。

以下質問。

  1. pythonのrequestsでstatus_codeを調べたい
  2. response["status_code"]でもいい?
  3. 以下はpytestでrequestsをmockにしてるんだけど、return_valueでresponse.status_codeが200となるようにできないかな(コード)
  4. いけた。ありがとう。 備忘録にしたい。pytestにおいて、Mockでrequestsのresponseでstatus_codeを返すことに主眼を置いた記事を書いて
目次