我最近遇到了类似的情况,但更极端。我的顶级模块之一必须模拟几个存储库、提供程序和逻辑库。这导致了许多需要@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
s 在运行时应用于每个测试,并将所有补丁传递给 *mocks 参数。要记住的重要一点是排序 - 我将索引注释放在我的代码中,以保持头脑清醒。
希望这可以帮助。