如何用pytest mock Google Cloud Storage Client多个实例的list_blobs方法?
解决两次实例化GCS Client的Mock问题
要mock两次不同的Client实例,关键是让被patch的google.cloud.storage.Client类每次被调用时返回不同的mock实例,这样就能分别配置每个实例对应的bucket和blobs。具体可以通过side_effect属性实现,它能让mock对象每次调用返回不同的值。
完整测试代码示例
from unittest.mock import patch, MagicMock import your_module # 替换为定义read_from_gcs函数的模块名 @patch("google.cloud.storage.Client") def test_read_from_gcs_with_bucket1(mock_client): # 1. 配置bucket_1对应的mock blobs bucket1_blobs = [ MagicMock(name="file1.txt"), MagicMock(name="file2.txt") ] mock_client1 = MagicMock() mock_client1.get_bucket.return_value.list_blobs.return_value = bucket1_blobs # 2. 配置bucket_2对应的mock blobs(包含重复和新增文件) bucket2_blobs = [ MagicMock(name="file2.txt"), # 与bucket_1重复 MagicMock(name="file3.txt"), # bucket_2独有文件 MagicMock(name="file4.txt") # bucket_2独有文件 ] mock_client2 = MagicMock() mock_client2.get_bucket.return_value.list_blobs.return_value = bucket2_blobs # 让Client类每次实例化返回不同的mock对象 mock_client.side_effect = [mock_client1, mock_client2] # 调用函数并转换生成器为列表 result = list(your_module.read_from_gcs(bucket_1="bucket_1", bucket_2="bucket_2")) # 断言结果:仅包含bucket_2独有的文件 assert result == ["file3.txt", "file4.txt"] # 验证调用逻辑是否符合预期 assert mock_client.call_count == 2 # Client被实例化2次 mock_client1.get_bucket.assert_called_once_with("bucket_1") mock_client2.get_bucket.assert_called_once_with("bucket_2")
关键说明
side_effect的核心作用:设置mock_client.side_effect = [obj1, obj2]后,第一次调用Client()返回obj1,第二次返回obj2,完全匹配函数中两次实例化Client的场景。- 独立配置mock实例:每个mock client实例单独配置
get_bucket和list_blobs的返回值,确保两次GCS操作的模拟数据互不干扰。 - 严谨的验证逻辑:除了断言返回结果,还可以验证Client的调用次数、
get_bucket的参数,确保函数逻辑符合预期。
内容的提问来源于stack exchange,提问作者eng2019
相关产品推荐
相关产品推荐

