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