我有一个测试套件(使用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应该能够自动执行的操作。有没有另外一种方法可以解决这个问题?或者我的最后一个例子是这样做的最佳方式吗?
答案 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