我是python mocking的新手。 我知道我们可以使用mock.patch来模拟f1进行f2测试。像这样:
def f1(x):
return x
def f2(x):
return f1(x) + 5
class ExampleTest(unittest.TestCase):
@mock.patch('__main__.f1')
def test_f2(self, mock_f1):
mock_f1.return_value = 0
self.assertEqual(f2(5), 5)
但我发现如果我在下面的测试用例中直接模拟f1,它就不起作用了。我不知道为什么不能直接在这里模拟“f1”?
class ExampleTest(unittest.TestCase):
def test_f2(self):
f1 = mock.Mock()
f1.return_value = 0
self.assertEqual(f2(5), 5)
答案 0 :(得分:3)
不确定为什么你认为这会奏效。您所做的只是定义一个名为f1
的新局部变量,它恰好是Mock的一个实例;就像你定义f1 = "foo"
一样,它根本不会影响模块级名称。
答案 1 :(得分:1)
即使patch
和Mock
属于同一个套餐,他们也有不同的职责:
mock.Mock()
创建模拟对象f1
(局部变量)patch('__main__.f1')
,您正在修补f1
模块中的__main__
引用(您正在运行的模块) patch
默认行为是使用模拟替换原始引用,但您也可以使用它来安装存根或伪造:主要职责是来控制替换引用的上下文强>
只是一个提示:看看where to patch ......它可以启发你。