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
相关产品推荐
相关产品推荐

