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

单元测试中Mock Avro反序列化生成器的实现疑问

解决Avro反序列化函数Mock不生效的问题

你的问题核心是patch的目标路径错误,导致Mock没有替换掉实际调用的函数引用,同时Mock返回值的设置也不符合函数预期。以下是修正方案:

1. 确认Patch路径的正确性

unittest.mock.patch的关键规则是:patch函数被调用的上下文路径,而不是原函数所在的模块路径。

举个例子:

  • 如果你的测试文件是test_data_processing.py,并且在测试代码里是这样导入函数的:
    from myModule import deserialize_generator
    
  • 那么你需要patch的是测试模块中的函数引用,也就是test_data_processing.deserialize_generator,而不是myModule.deserialize_generator。

2. 修正Mock返回值设置

你的原代码给Mock返回了一个MagicMock对象,但实际上你需要模拟的是函数直接返回解码后的内容,不需要额外包装status_code这类属性(除非原函数本身返回这种结构,但从你的断言来看,原函数应该直接返回反序列化后的数据)。

修正后的测试代码示例

from unittest.mock import patch
import your_test_module  # 替换成你的测试模块名
from myModule import deserialize_generator  # 如果是这样导入的

@patch('your_test_module.deserialize_generator')  # 重点:patch测试模块中的引用
def test_serialized_data_conversion(self, mock_deserialize):
    schema_url = "mock_url"
    serialized_content = load_fixture("serialized_content.json")
    expected_deserialized_content = load_fixture("deserialized_content.json")

    # 直接设置Mock的返回值为期望的反序列化结果
    mock_deserialize.return_value = expected_deserialized_content

    # 调用函数,此时会使用Mock而非原函数
    result = deserialize_generator(serialized_content, schema_url, logger)
    
    self.assertEqual(result, expected_deserialized_content)
    # 可选:验证Mock被调用了一次,确保没有走原函数
    mock_deserialize.assert_called_once_with(serialized_content, schema_url, logger)

额外排查点

  • 如果你的代码是在其他模块中调用deserialize_generator,比如data_processor.py里调用了这个函数,那测试时需要patchdata_processor.deserialize_generator,也就是函数被实际调用的那个模块里的引用。
  • 确保没有在测试代码中重新导入函数,导致Mock失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 16:02:14