【发布时间】:2019-12-23 19:16:50
【问题描述】:
如何在 python 中用另一个函数模拟一个函数,该函数也将提供一个模拟对象?
我有类似这样的代码:
def foo(arg1, arg2):
r = bar(arg1)
# does interesting things
我想替换 bar 函数的实现,让它返回合理的值,并确保使用正确的参数调用它。
我已经尝试过了,fake_bar 是我对bar 的简单替换:
from unittest.mock import patch
def test_foo():
with patch("x.bar", fake_bar) as mock_bar:
actual = foo(arg1, arg2)
assert actual == expected
mock_bar.assert_called_once_with(arg1)
但是,我收到此错误:
AttributeError: 'function' 对象没有属性 'assert_call_once'
我找到了建议使用 create_autospec 的 this question。但是,mock.create_autospec 不保留返回值。
python documentation 建议执行以下操作:
mock_function = create_autospec(function, return_value='fishy')
但是,我伪造的 bar 计算的返回值不是静态的,也不是那么容易放入内联 lambda。
我觉得我错过了一些明显的东西。有没有一种方法可以轻松地模拟一个函数并用比静态返回值更复杂的东西替换它的实现?
【问题讨论】:
标签: python unit-testing mocking