我怎样才能在Python中模拟等待库?

时间:2016-12-13 09:38:24

标签: python python-3.x unit-testing mocking polling

我在我的一些代码中使用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())

但我发现它实际上是调用库的代码而不是短路返回。

如何在不实际调用代码的情况下强制此方法简单地返回值(或引发副作用)?

1 个答案:

答案 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中使用的模块相同的模块。