如何测试函数中f2的调用?解决Mock测试assert_called_once报错问题
正确测试函数f1调用f2的方法
假设你的函数定义在functions.py中:
def f1(x): f2(x+3) return x * x def f2(y): print("some statement")
你需要实现的测试目标是:验证f1的返回值正确,同时确认f1内部确实调用了f2且传入预期参数,并且不触发f2的print输出。
你之前的错误分析
- 第一种写法直接调用
f2(1)并断言返回值,这是在调用原函数,完全无法反映f1内部的调用逻辑,没有测试价值。 - 第二种写法错误地将原函数
f2赋值给mock对象,没有真正完成patch操作,所以f2还是原函数,自然没有mock专属的assert_called_once方法。
正确的测试代码
def test_f1(mocker): # 对functions.f2进行patch,得到对应的mock对象 mock_f2 = mocker.patch("functions.f2") # 执行被测试函数 result = f1(1) # 断言f1的返回值符合预期 assert result == 1 # 断言f2被恰好调用一次,且传入的参数是4(1+3) mock_f2.assert_called_once_with(4)
代码说明
mocker.patch("functions.f2")会将原函数f2替换为一个mock对象,这个mock不会执行原函数的print逻辑,同时会自动记录所有调用细节。- 保存patch返回的mock对象
mock_f2,通过它的断言方法验证调用情况:assert_called_once_with(4):同时验证调用次数(恰好一次)和传入的参数(4),完全匹配你的需求。
- 如果需要单独验证调用次数或参数,还可以用这些方式:
- 验证调用次数:
assert mock_f2.call_count == 1 - 验证最后一次调用的参数:
mock_f2.assert_called_with(4)
- 验证调用次数:
内容的提问来源于stack exchange,提问作者ms360
相关产品推荐
相关产品推荐

