为什么不能在unittest中直接模拟对象?

时间:2016-02-22 10:18:45

标签: python mocking

我是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)

2 个答案:

答案 0 :(得分:3)

不确定为什么你认为这会奏效。您所做的只是定义一个名为f1的新局部变量,它恰好是Mock的一个实例;就像你定义f1 = "foo"一样,它根本不会影响模块级名称。

答案 1 :(得分:1)

即使patchMock属于同一个套餐,他们也有不同的职责:

  1. 通过mock.Mock()创建模拟对象f1(局部变量)
  2. 通过patch('__main__.f1'),您正在修补f1模块中的__main__引用(您正在运行的模块)
  3. patch默认行为是使用模拟替换原始引用,但您也可以使用它来安装存根或伪造:主要职责是来控制替换引用的上下文

    只是一个提示:看看where to patch ......它可以启发你。