如何覆盖函数python?

时间:2018-03-05 14:30:22

标签: python unit-testing override

我有一些我想快速测试的代码。此代码包含一行需要查询服务器并获得True / False答案:

result = server.queryServer(data)

有没有办法覆盖这个函数调用,以便它只调用一个总是返回True的本地函数(这样我可以调试而不运行服务器)?

2 个答案:

答案 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()

我在那里加了一个断言;模拟对象不仅可以让您透明地替换函数,还可以记录它们发生的事情,让您通过调用模拟来检查代码是否正常工作。