如何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
相关产品推荐
相关产品推荐

