如何设置并验证Python Mock的链式调用(测试Greeter类场景)
处理Greeter类中链式Mock调用的方案
构造嵌套Mock对象直接注入
你可以直接创建Mock对象模拟Foo,让它的get_bar()方法返回另一个模拟Bar的Mock,再给这个Bar的format()方法设置预期返回值。示例测试代码:
from unittest.mock import Mock from greeter import Greeter def test_greeter_hi(): # 模拟Bar对象 mock_bar = Mock() mock_bar.format.return_value = "ALICE" # 模拟Foo对象,让get_bar返回上面的mock_bar mock_foo = Mock() mock_foo.get_bar.return_value = mock_bar # 初始化Greeter并注入mock_foo greeter = Greeter(mock_foo) result = greeter.hi("alice") # 验证结果符合预期 assert result == "Hi ALICE" # 验证链式调用的各方法都被正确触发 mock_foo.get_bar.assert_called_once() mock_bar.format.assert_called_once_with("alice")使用patch装饰器Mock Foo类
若需要Mock整个Foo类,可借助patch装饰器实现,再逐层设置链式调用的返回值。示例测试代码:
from unittest.mock import patch, Mock from greeter import Greeter def test_greeter_hi_with_patch(): with patch('greeter.Foo') as mock_foo_cls: # 模拟Foo实例的get_bar返回mock_bar mock_bar = Mock() mock_bar.format.return_value = "BOB" mock_foo_instance = mock_foo_cls.return_value mock_foo_instance.get_bar.return_value = mock_bar # 初始化Greeter,使用Mock的Foo实例 greeter = Greeter(mock_foo_instance) result = greeter.hi("bob") assert result == "Hi BOB" # 验证调用链的每一步 mock_foo_cls.assert_called_once() mock_foo_instance.get_bar.assert_called_once() mock_bar.format.assert_called_once_with("bob")
核心逻辑:链式调用Mock的关键是让上层Mock的方法返回下层Mock对象,以此模拟foo.get_bar().format()的调用链路,之后还能分别验证每个方法的调用次数与参数。
内容的提问来源于stack exchange,提问作者Dagang Wei
相关产品推荐
相关产品推荐

