pytestで関数がn回呼ばれていることをテストしたい

2022/12/09に公開

問題

  • pytestを使っている
  • ある関数A内で関数Bがn回呼ばれることをテストしたい
  • どうするか?

対応

pytest-mock を利用する。
https://pypi.org/project/pytest-mock/

例えば、

class FooApiClient:
    def fetch(self, i: int):
        return i


class Bar:
    def __init__(self, foo: FooApiClient):
        self.__foo = foo

    def execute(self, count: int):
        for i in range(count):
            self.__foo.fetch(i)

FooApiClient を利用する Bar クラスがあるとする。
execute を実行した際に fetch がn回呼ばれたことをテストしたいとする。
下記のようにテストを書く。

import src.d_1208.sandbox


def test_s(mocker):
    mocked = mocker.patch("src.d_1208.sandbox.FooApiClient.fetch")
    foo = src.d_1208.sandbox.FooApiClient()
    bar = src.d_1208.sandbox.Bar(foo)
    bar.execute(2)

    assert mocked.call_count == 2

ディレクトリ構成は下記。

├─src
│  └─d_1208
│          sandbox.py
│
└─test
    │  test_1208.py

Discussion