使用Mock修补函数

时间:2012-04-12 12:57:43

标签: python unit-testing mocking patch

我有一个测试套件(使用nose,而不是unittest),我想修补一个函数,为测试类中的每个测试返回一个特定的值序列。我的第一次尝试是使用一个简化的例子:

@patch('time.clock', MagicMock(side_effects=[1, 2]))
class Tests:
    def test_1(self):
        assert time.clock() == 1
        assert time.clock() == 2

    def test_2(self):
        assert time.clock() == 1
        assert time.clock() == 2

但是,MagicMock实例仅创建一次,因此当副作用用尽时,第二次测试失败。我可以单独修补每个测试方法,但我真的不想在所有测试方法上复制修补程序装饰器(测试中的测试比这个例子多得多!)我能做的另一种方法是创建补丁像这样的设置代码:

class Tests:
    def setup(self):
        self.old_clock = time.clock
        time.clock = MagicMock(side_effects=[1, 2])

    def teardown(self):
        time.clock = self.old_clock

    def test_1(self):
        assert time.clock() == 1
        assert time.clock() == 2

    def test_2(self):
        assert time.clock() == 1
        assert time.clock() == 2

但保存和恢复原始函数定义似乎是Mock应该能够自动执行的操作。有没有另外一种方法可以解决这个问题?或者我的最后一个例子是这样做的最佳方式吗?

2 个答案:

答案 0 :(得分:2)

a = (x for x in [1,2])

x = lambda : next(a)

x()

出:1

x()

出:2

将您的答案放入列表中。 将X改为您想要的名字。

答案 1 :(得分:1)

您应该将修补程序应用于每个测试,而不是将其应用于类:

class Tests:
    @patch('time.clock', MagicMock(side_effects=[1, 2]))
    def test_1(self):
        assert time.clock() == 1
        assert time.clock() == 2

    @patch('time.clock', MagicMock(side_effects=[1, 2]))
    def test_2(self):
        assert time.clock() == 1
        assert time.clock() == 2