在python中模拟或修补类实例变量?

在python中模拟或修补类实例变量?,python,unit-testing,boto3,Python,Unit Testing,Boto3,因此,我在文件/S3.py中有一个类S3,具有以下init: S3类: 定义初始化(自): self.s3_client=boto3.client(“s3”) def get_对象(自身): s3\u object=self.s3\u client.get\u object() 返回s3_对象 如您所见,boto3.client类还有一个名为get\u object()的方法。我正在测试另一个文件中的自定义get\u object()方法,但不想实际对AWS服务进行boto3.client调用

因此,我在文件/S3.py中有一个类S3,具有以下init:

S3类:
定义初始化(自):
self.s3_client=boto3.client(“s3”)
def get_对象(自身):
s3\u object=self.s3\u client.get\u object()
返回s3_对象
如您所见,boto3.client类还有一个名为
get\u object()
的方法。我正在测试另一个文件中的自定义
get\u object()
方法,但不想实际对AWS服务进行boto3.client调用

test.py

类TestS3Class(unittest.TestCase):
“”“文件/s3.py的测试用例”“”
def设置(自):
“”“为测试创建live S3类的实例”“”
self.s3\u test\u client=s3()
@修补程序('boto3.client')
def test_get_对象(自身、模拟客户端):
""""""
mock_client.get_object.return_value={'key':'value'}
self.assertIsInstance(self.s3\u test\u client.get\u object(),dict)
目前我得到的是
AssertionError:None不是作为响应的
的实例,因此我不确定是否正在修补某些东西,但它肯定没有将bot3.client.get_object()的返回值设置为dictionary对象


任何关于如何模拟self.s3_client=boto3.client()的提示?

boto3.client
将根据第一个参数返回动态创建的类的实例(请参见),因此您不能使用要求目标对象可导入的
patch
方法

相反,您可以使用调用时返回所需dict的
Mock
对象对客户机的class对象的
get\u object
属性进行修补:

class TestS3Class(unittest.TestCase):
    def setUp(self):
        self.s3_test_client = S3()
        self.s3_test_client.s3_client.__class__.get_object = Mock(return_value={'key': 'value'})

    def test_get_object(self):
        self.assertIsInstance(self.s3_test_client.get_object(), dict)

演示:

我担心这与我的类函数与boto3.client方法get\u object()命名相同有关。我不知道出了什么问题啊,该死,我花了不少时间想弄明白。遇到。是的,这似乎奏效了。谢谢@blhsing.Oh,我想我应该从以下事实中猜到,创建正确的客户机类需要一个参数
ec2
s3
,等等。。。