如何在 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
中使用的相同模块。
我在我的一些代码中使用 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
中使用的相同模块。