为什么不能在单元测试中直接模拟对象?
Why can't directly mock object in unittest?
我是 python 模拟的新手。
我知道我们可以使用 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)
不确定为什么您认为这会奏效。您所做的只是定义一个名为 f1
的新局部变量,它恰好是 Mock 的一个实例;就像您定义了 f1 = "foo"
一样,它根本不会影响模块级名称。
即使 patch
and Mock
在同一个包裹中,他们也有不同的职责:
- 通过
mock.Mock()
你正在创建一个模拟对象 f1
(局部变量)
- 通过
patch('__main__.f1')
,您正在修补 __main__
模块中的 f1
参考(您是 运行)
patch
默认行为是使用模拟来替换原始引用,但您也可以使用它来安装存根或伪造:主要职责是 控制替换的上下文参考.
小贴士:看看where to patch ...它可以启发你。
我是 python 模拟的新手。 我知道我们可以使用 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)
不确定为什么您认为这会奏效。您所做的只是定义一个名为 f1
的新局部变量,它恰好是 Mock 的一个实例;就像您定义了 f1 = "foo"
一样,它根本不会影响模块级名称。
即使 patch
and Mock
在同一个包裹中,他们也有不同的职责:
- 通过
mock.Mock()
你正在创建一个模拟对象f1
(局部变量) - 通过
patch('__main__.f1')
,您正在修补__main__
模块中的f1
参考(您是 运行)
patch
默认行为是使用模拟来替换原始引用,但您也可以使用它来安装存根或伪造:主要职责是 控制替换的上下文参考.
小贴士:看看where to patch ...它可以启发你。