5

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

4

2 回答 2

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

x = lambda : next(a)

x()

出:1

x()

出:2

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

于 2013-05-29T08:57:22.370 回答
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
于 2013-11-05T08:50:41.410 回答