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

如何对被Patch的Python Mock对象调用进行断言及设置返回值

解决Mock Boto3客户端时的断言与返回值设置问题

你现在的核心问题是找错了mock对象的层级:

  • mock_init_boto是被Patch的_init_boto方法本身,而describe_stacks是这个方法返回的CloudFormation客户端mock对象的方法。
  • 从你打印的mock_calls也能看出来:call('dev')是调用_init_boto('dev'),call().describe_stacks(...)是调用该方法返回的客户端的describe_stacks,这里的call()就对应mock_init_boto.return_value。

修正后的测试代码

from unittest.mock import patch
from cf_stack_exists import CfStackExistsSimplified

class TestCfStackExists:
    @patch.object(CfStackExistsSimplified, "_init_boto")
    def test_example(self, mock_init_boto):
        # 1. 设置describe_stacks的自定义返回值
        mock_cf_client = mock_init_boto.return_value
        mock_cf_client.describe_stacks.return_value = {
            'Stacks': [{'StackName': 'dev', 'StackStatus': 'CREATE_COMPLETE'}]
        }

        # 执行测试逻辑
        myclass = CfStackExistsSimplified(aws_profile="dev")
        response = myclass.exec()

        # 2. 正确断言describe_stacks的调用
        mock_cf_client.describe_stacks.assert_called_once_with(StackName='dev')
        
        # 验证返回值是否符合预期
        assert response['Stacks'][0]['StackName'] == 'dev'

关键说明

  • 要获取mock的CloudFormation客户端,必须用mock_init_boto.return_value,因为_init_boto方法被mock后,它的返回值就是我们需要的客户端mock对象。
  • 设置返回值时,通过mock_cf_client.describe_stacks.return_value指定describe_stacks方法的返回内容。
  • 断言调用时,直接在客户端mock对象的describe_stacks方法上使用assert_called_once_with(或其他断言方法),这样就能精准验证调用参数和次数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 18:05:12