python - 在 python 中模拟或修补类实例变量?
问题描述
所以我在 file/s3.py 中有一个类 S3,它具有以下初始化:
class S3:
def __init__(self):
self.s3_client = boto3.client("s3")
def get_object(self):
s3_object = self.s3_client.get_object()
return s3_object
如您所见,boto3.client 类也有一个名为的方法get_object()
。我正在get_object()
从另一个文件测试我的自定义方法,但不想实际对 AWS 服务进行 boto3.client 调用。
test.py
class TestS3Class(unittest.TestCase):
"""TestCase for file/s3.py"""
def setUp(self):
"""Creates an instance of the live S3 class for testing"""
self.s3_test_client = S3()
@patch('boto3.client')
def test_get_object(self, mock_client):
""""""
mock_client.get_object.return_value = {'key': 'value'}
self.assertIsInstance(self.s3_test_client.get_object(), dict)
目前我得到AssertionError: None is not an instance of <class 'dict'>
了回应,所以我不确定我是否正在修补某些东西,但它绝对没有将 boto3.client.get_object() 的返回值设置为字典对象。
关于如何模拟 self.s3_client = boto3.client() 的任何提示?
解决方案
boto3.client
根据第一个参数返回一个动态创建的类的实例(参见源代码),因此您不能使用该patch
方法,该方法要求目标对象是可导入的。
相反,您可以使用在调用时返回所需字典get_object
的对象对客户端的类对象的属性进行猴子修补:Mock
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)
推荐阅读
- c# - C# 比较引用和值类型与 null
- angular - TypeError: Object(...) is not a function at index.js
- r - R中使用索引的列表列表
- javascript - 如何使用 Bootstrap 4 使图像中的按钮居中
- xamarin - 通过绑定显示 JSON 响应(Xamarin 表单)
- java - I/Choreographer:跳过了8帧!应用程序可能在其主线程上做了太多工作
- parsing - 如何组合 antlr 解析器和词法分析器文件
- php - 我认为即使他可以找到文件是否存在,移动上传的文件也不起作用
- python - 在 pytorch 中,我们如何将模型的权重保存到我的 github 中的文件中
- javascript - 从数组中应用过滤器选项