You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何测试函数中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 03:33:29