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

Python单元测试Mock Google Pub/Sub遇未定义错误及调用失败

问题解决方案

问题1:name 'fileDownloaderWorkerPubSub' is not defined 报错

这个错误是因为测试代码直接引用了main.py中初始化的fileDownloaderWorkerPubSub实例,但该实例的作用域未在测试环境中正确暴露,或者测试代码未正确导入/mock该实例。解决思路是避免直接依赖原实例,改用以下两种方式之一:

方式1:依赖注入(推荐,更易测试)

修改Workers类,将Pub/Sub实例通过构造函数传入,而非硬编码引用main.py的实例:

# workers.py
class Workers:
    def __init__(self, pubsub_client):
        self.pubsub_client = pubsub_client

    def file_downloader_worker(self, msg):
        # 消息处理逻辑
        processed_msg = {"processed": "data"}
        # 使用注入的客户端发布消息
        self.pubsub_client.publish("your-topic-path", processed_msg)

测试时直接传入mock的Pub/Sub实例,无需引用原实例:

# test_workers.py
from unittest.mock import Mock
from workers import Workers

def test_file_downloader_worker():
    # 创建mock Pub/Sub客户端
    mock_pubsub = Mock()
    # 注入mock实例初始化Worker
    worker = Workers(pubsub_client=mock_pubsub)
    
    # 执行测试方法
    test_msg = {"raw": "data"}
    worker.file_downloader_worker(test_msg)
    
    # 验证publish被调用
    mock_pubsub.publish.assert_called_once()

方式2:Mock Workers类中引用的实例路径

如果无法修改Workers类的构造方式,直接mockworkers.py中导入的fileDownloaderWorkerPubSub实例:

# test_workers.py
from unittest.mock import patch
from workers import Workers

# 注意:patch的路径是workers.py中实际引用该实例的路径
@patch("workers.fileDownloaderWorkerPubSub")
def test_file_downloader_worker(mock_pubsub):
    worker = Workers()
    test_msg = {"raw": "data"}
    
    worker.file_downloader_worker(test_msg)
    
    # 验证publish被调用
    mock_pubsub.publish.assert_called_once()

问题2:Mock的publish方法未被调用

这个问题的核心是mock的目标路径错误。Python的mock遵循"在哪里使用,就在哪里mock"的原则:

  • 你之前mock的是src.vapubsub.pubsub_v1.PublisherClient(类),但实际调用的是fileDownloaderWorkerPubSub实例的publish方法,二者不是同一个对象。
  • 正确的mock目标应该是workers.py中实际使用的fileDownloaderWorkerPubSub实例(即上述方式2中的@patch("workers.fileDownloaderWorkerPubSub")),或者依赖注入传入的mock实例(方式1)。

只要确保mock的是被测试方法实际调用的那个publish方法所属的对象,就能触发正确的断言。

内容的提问来源于stack exchange,提问作者Shivam Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:52:55