如何在 Python 中模拟等待库?

How can I mock waiting library in Python?

我在我的一些代码中使用 waiting 库来等待条件变为真。作为库的一部分,waiting.wait returns True 当谓词为真时;否则它会抛出异常或永远等待,具体取决于超时值等。

我想在我的测试中将其修补为始终 return 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())

不过,我发现它实际上调用了库的代码,而不是使 return.

短路

如何在不实际调用代码的情况下强制此方法简单地 return 一个值(或产生副作用)?

您的 waiting.wait.return_value = True 将不起作用,因为 waiting.wait 不是模拟对象。您只向现有 wait 函数添加了任意属性,但该函数不会使用该属性。

要 mock 出 wait 函数,直接 mock 即可:

from unittest import mock

with mock.patch('__main__.wait'):
    wait.return_value = True

无需模拟 waiting 库的内部结构,您希望在代码中发生的所有事情是立即 returns 调用 wait() 的任何使用。

请注意,我选择了 __main__ 模块来修补名称 wait(),请参阅 unittest.mock 文档中的 Where to patch

您的实际位置可能不同,如果您在任何地方都使用 import waiting,那么您就必须使用 mock.patch('waiting.wait')。否则,您通常会应用它与您在 from waiting import wait 中使用的相同模块。