我在 python (2.7) 中有一个方法可以执行 foo 操作,如果 foo 不起作用,则在 5 分钟后放弃。
def keep_trying(self):
timeout = 300 #empirically derived, appropriate timeout
end_time = time.time() + timeout
while (time.time() < end_time):
result = self.foo()
if (result == 'success'):
break
time.sleep(2)
else:
raise MyException('useful msg here')
我知道 foo() 的一些可能结果,因此我使用模拟来伪造这些返回值。问题是,我不希望测试在看到异常之前运行 5 分钟。
有没有办法覆盖本地超时值?我希望这只是几秒钟,这样我就可以看到循环尝试几次,然后放弃并加注。
以下不起作用:
@patch.object(myClass.keep_trying, 'timeout')
@patch.object(myClass, 'foo')
def test_keep_trying(self, mock_foo, mock_timeout):
mock_foo.return_value = 'failed'
mock_timeout.return_value = 10 # raises AttributeError
mock_timeout = 10 # raises AttributeError
...
您不能模拟函数的局部变量。为了使您的代码更易于测试,请将其更改为,例如:
def keep_trying(self, timeout=300):
end_time = time.time() + timeout
# etc, as above
因此,对于测试来说,以更短的超时运行它变得微不足道!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)