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

如何设置并验证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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:47:15