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

如何使用Python MagicMock模拟Azure ServiceBus Receiver实现单元测试

你的测试代码存在两个核心问题导致无法进入for循环、断言失败:

  • 上下文管理器的返回值需要通过__enter__()方法获取:ServiceBusClient.from_connection_string()和get_queue_receiver()返回的都是上下文管理器对象,with ... as xxx语法会自动调用对象的__enter__()方法,将返回值赋值给xxx变量。你之前的mock没有处理这两层__enter__()调用,导致实际代码拿到的receiver不是你设置的迭代器,自然不会进入for循环。
  • 日志对象断言错误:你patch的receiver.logger是已经实例化的日志对象,不是类,断言时不需要加.return_value。

修正后的测试代码如下:

# test_receiver.py
from unittest.mock import patch
from receiver import receive_message

@patch("receiver.ServiceBusClient")
@patch("receiver.logger")
def test_receive_message(mock_logger, mock_svcbus_client):
    # 处理第一层上下文:ServiceBusClient.from_connection_string的__enter__返回值就是as后的servicebus_client
    mock_client_instance = mock_svcbus_client.from_connection_string.return_value.__enter__.return_value
    # 处理第二层上下文:get_queue_receiver的__enter__返回值就是as后的receiver,设置为可迭代的测试消息
    mock_client_instance.get_queue_receiver.return_value.__enter__.return_value = iter(["mock_message"])

    receive_message("mock_connection_str", "mock_q_name")
    
    # 直接断言debug方法调用,匹配日志内容
    mock_logger.debug.assert_called_once_with("Received message mock_message")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:45:04