我有一些我想快速测试的代码。此代码包含一行需要查询服务器并获得True / False答案:
result = server.queryServer(data)
有没有办法覆盖这个函数调用,以便它只调用一个总是返回True的本地函数(这样我可以调试而不运行服务器)?
答案 0 :(得分:1)
Mock是你的朋友。它允许您模拟它们的整个类或函数。
答案 1 :(得分:1)
你想要的是 mocking ,用临时对象替换现有对象,这些对象只是为了测试而采取不同的行为。
使用unittest.mock
library执行此操作。它将为您创建临时对象,并为您提供替换对象的工具,并在测试期间恢复旧情况。
该模块提供patchers来进行替换。例如,您可以使用上下文管理器:
from unittest import mock
with mock.patch('server.queryServer') as mocked_queryServer:
mocked_queryServer.return_value = True # always return True when called
# test your code
# ...
# afterwards, check if the mock has been called at least once.
mocked_queryServer.assert_called()
我在那里加了一个断言;模拟对象不仅可以让您透明地替换函数,还可以记录它们发生的事情,让您通过调用模拟来检查代码是否正常工作。