概要
エントリーポイント内でクラスのインスタンスを作成し、クラス内のメソッドをmain
関数内で呼び出す場合のモック方法について説明します。
テスト対象
-
main
関数の中でクラス「ClassExample
」のメソッド「get_number
」を呼び出す - エントリーポイント内で「
ClassExample
」のインスタンスを作成
examle.py
def main():
number = class_example.get_number()
return number
if __name__ == "__main__":
# クラスのインスタンスを作成
class_example = ClassExample()
# main関数の呼び出し
main()
テストコード
以下のテストコードでは、pytest
とunittest.mock
を使用して、ClassExample
クラスのメソッド呼び出しをモックしています。
test_example.py
import pytest
from unittest.mock import patch, MagicMock
import example
# fixtureを使用し、エントリーポイントでインスタンスを作成するクラスを設定
@pytest.fixture
def class_example_setup():
with patch('example.ClassExample') as Mock:
mock_instance = Mock.return_value
mock_instance.get_number = MagicMock()
example.class_example = mock_instance
yield mock_instance
def test_main(class_example_setup, mocker):
example.main()
# クラス内のメソッドが呼び出されたことを検証
assert class_example_setup.get_number.call_count == 1
ポイント
-
pytest.fixture
の使用: クラスのインスタンスをモックし、main
関数のテストが実行される前にセットアップします。 -
unittest.mock
の使用:ClassExample
クラスのメソッドをモックして、実際のメソッド呼び出しをシミュレートします。 -
main
関数の呼び出しと検証: テスト内でmain
関数を呼び出し、get_number
メソッドが正しく呼び出されたことを確認します。
その他
この方法はChatGPTを使用して辿り着きました。
(テストコード作成中に詰まりました)
より良い方法があれば、ご教示いただきたいです。
(新規作成時にはクラスのインスタンス作成場所についても考慮する必要があるかもしれません。勉強します。。。)