我在文件夹controller/下有以下三个python文件
class Math:
def __init__(self, a, b):
self.a = a
self.b = b
def addition(self):
return self.a + self.b
from controller.math import Math
def perform_addition():
math = Math(1, 2)
return math.addition()
from unittest.mock import MagicMock, patch
def test_addition():
mock_math = MagicMock()
with patch('controller.math.Math', return_value=mock_math) as MockClass:
instance = MockClass.return_value
instance.addition.return_value = 100
from controller.calculation import perform_addition
output = perform_addition()
print(output) # prints 100
post_patch_output = perform_addition()
print(post_patch_output) # prints 100 but expected 3
当我执行 test_addition 时,我期望
post_patch_output
返回 3,但它返回 100,即模拟输出。我很好奇我在这里错过了什么?
从mock.patch的文档这里,它说
When the function/with statement exits the patch is undone.
这看起来不像这里的情况
test_addition
您必须修改文件
test_sample.py
,如下所示:
from unittest.mock import MagicMock, patch
from controller.calculation import perform_addition
def test_addition():
mock_math = MagicMock()
#with patch('controller.math.Math', return_value=mock_math) as MockClass:
with patch('controller.calculation.Math', return_value=mock_math) as MockClass:
instance = MockClass.return_value
instance.addition.return_value = 100
#from controller.calculation import perform_addition
output = perform_addition()
print(output) # prints 100
post_patch_output = perform_addition()
print(post_patch_output) # prints 100 but expected 3
test_addition()
这是执行
test_addition()
的输出:
100
3
如你所料。
Math
内而不是在 calculation.py
内修补由名称
math.py
from controller.calculation import perform_addition
,而不是在方法内部test_addition