单元测试中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
相关产品推荐
相关产品推荐

