为什么不能在单元测试中直接模拟对象?

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 在同一个包裹中,他们也有不同的职责:

  1. 通过 mock.Mock() 你正在创建一个模拟对象 f1(局部变量)
  2. 通过 patch('__main__.f1'),您正在修补 __main__ 模块中的 f1 参考(您是 运行)

patch 默认行为是使用模拟来替换原始引用,但您也可以使用它来安装存根或伪造:主要职责是 控制替换的上下文参考.

小贴士:看看where to patch ...它可以启发你。