私は最近、同様の状況に遭遇しましたが、より極端です。私の最上位モジュールの 1 つは、いくつかのリポジトリ、プロバイダー、およびロジック ライブラリをモック化する必要がありました。@patch
これにより、 7 つのコンポーネントに必要な多数の単体テストが発生しました。多くの重複したテストコードを避けたかったので、かなりうまく機能した私のソリューションは次のとおりです。
@mock.patch('module.blah1.method1') # index: 6
@mock.patch('module.blah1.method2') # index: 5
@mock.patch('module.blah2.method1') # index: 4
@mock.patch('module.blah2.method2') # index: 3
@mock.patch('module.blah2.method3') # index: 2
@mock.patch('module.blah3.method1') # index: 1
@mock.patch('module.blah4.method1') # index: 0
class TestsForMyCode(unittest.TestCase):
def test_first_test(self, *mocks):
# Arrange
# setup mocks for only the ones that need specific mocked behaviours
# idx 2 patches module.blah2.method3
mocks[2].return_value = 'some value'
# Act
target = sut()
result = target.do_something()
# Assert
assert result is False
def test_second_test(self, *mocks):
# Arrange
# setup mocks for only the ones that need specific mocked behaviours
# idx 0 patches module.blah4.method1
mocks[0].return_value = 'another value'
# idx 4 patches module.blah2.method1
mocks[4].return_value = 'another value'
# Act
target = sut()
result = target.do_something_else()
# Assert
assert result is True
クラスの@mock
は、実行時に各テストに適用され、すべてのパッチを *mocks パラメータに渡します。覚えておくべき重要なことは順序付けです。頭の中でまっすぐに保つために、インデックス コメントをコードに配置します。
お役に立てれば。