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

如何Mock子方法?测试含内部调用方法的函数求助

没问题,这事儿很容易解决!你已经搞定了value_a的Mock,要同时Mockabcd_foo里调用的another_method只需要多添一个@patch装饰器,或者用上下文管理器就行,给你两种具体的实现方式:

方法一:堆叠@patch装饰器

这种方式最直接,在测试方法上多加一个@patch就好,非常适合固定需要Mock多个对象的场景:

from unittest.mock import patch
import hello

# 注意装饰器的顺序:最下面的对应函数的第一个参数
@patch('hello.value_a')  # 你已经在使用的Mock
@patch('hello.another_method')  # 新增的another_method Mock
def test_abcd_foo(mock_another_method, mock_value_a):
    # 可选:给Mock设置返回值或自定义行为
    mock_value_a.return_value = 100  # 比如让value_a返回100
    
    # 调用被测方法
    hello.abcd_foo(1, 2, 3, 4)
    
    # 可选:验证another_method是否被正确调用
    mock_another_method.assert_called_once()

⚠️ 小提醒:装饰器的顺序和函数参数是反过来的——最下方的@patch对应函数的第一个参数,别搞混啦!

方法二:使用with语句上下文管理器

如果只是在测试方法的某一段逻辑里需要Mock多个对象,或者不想堆叠装饰器,用with语句会更灵活:

from unittest.mock import patch
import hello

def test_abcd_foo():
    # 同时Mock两个方法,用逗号分隔
    with patch('hello.value_a') as mock_value_a, patch('hello.another_method') as mock_another_method:
        # 配置Mock行为
        mock_value_a.return_value = 200
        
        # 调用被测方法
        hello.abcd_foo(1, 2, 3, 4)
        
        # 验证another_method的调用情况
        mock_another_method.assert_called_once()
关键注意点
  • Patch路径要正确:因为abcd_foo是在hello.py内部调用的another_method(),所以你必须patchhello.another_method,而不是直接写another_method——这是Mock时最容易踩的坑!
  • 可选的验证步骤:用assert_called_once()、assert_called_with()这类断言,可以确保你的被测方法确实按预期调用了another_method,让测试更可靠。

内容的提问来源于stack exchange,提问作者PySaad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:31:36