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

