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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:42:56