我在我的一些代码中使用waiting
库来等待条件变为真。作为库的一部分,waiting.wait
在谓词为真时返回True
;否则它会抛出异常或永远等待,具体取决于超时值等。
我想在我的测试中对此进行修补,以便始终返回True
而不进入等待周期。这是我的尝试:
#!/usr/bin/env python3
from unittest.mock import Mock
import waiting
from waiting import wait
def test_waiting():
waiting.wait.return_value = True
# Below *should* wait forever because it can never be true.
# Want to make it return true instead.
return wait(lambda: False)
if __name__ == "__main__":
assert(test_waiting())
但我发现它实际上是调用库的代码而不是短路返回。
如何在不实际调用代码的情况下强制此方法简单地返回值(或引发副作用)?
答案 0 :(得分:1)
waiting.wait.return_value = True
无效,因为waiting.wait
不是模拟对象。您只向现有wait
函数添加了任意属性,但该函数不会使用该属性。
要模拟wait
函数,只需直接模拟:
from unittest import mock
with mock.patch('__main__.wait'):
wait.return_value = True
无需模拟waiting
库的内部,您希望在代码中发生的任何事情都是wait()
callable立即返回。
请注意,我选择了__main__
模块来修改名称wait()
,请参阅unittest.mock
文档中的Where to patch。
您的实际位置可能会有所不同,如果您到处使用import waiting
,那么您必须使用mock.patch('waiting.wait')
。否则,您通常会使用与from waiting import wait
中使用的模块相同的模块。