使用 Mock 修补函数



我有一个测试套件(使用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 应该能够自动完成的事情。 有没有我缺少的另一种方法? 或者我的最后一个例子是最好的方法?

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

出: 1

x()

出: 2

将您的答案放入 a 的列表中。将 X 更改为所需的名称。

您应该只将补丁应用于每个测试,而不是将其应用于类:

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

最新更新