0
0

エントリーポイントでのクラスのインスタンス作成をテストする(pytest)

Last updated at Posted at 2024-07-23

概要

エントリーポイント内でクラスのインスタンスを作成し、クラス内のメソッドを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()

テストコード

以下のテストコードでは、pytestunittest.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を使用して辿り着きました。
(テストコード作成中に詰まりました)
より良い方法があれば、ご教示いただきたいです。

(新規作成時にはクラスのインスタンス作成場所についても考慮する必要があるかもしれません。勉強します。。。)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0