Python使用unittest时如何mock create_my_obj内MyObj的入参?
实现方案
核心思路
使用unittest.mock.patch根据使用处路径mockMyObj类,通过side_effect拦截构造调用,替换指定参数后再调用真实的MyObj构造逻辑,既实现参数修改,又不破坏原有业务流程的真实性,不影响二进制生成对比的有效性。
具体实现步骤
- 确定patch路径:如果你的
create_my_obj函数定义在my_module.py文件中,且该文件内是通过from xxx import MyObj导入的类,那么你需要patch的路径为my_module.MyObj(即create_my_obj所在模块内引用的MyObj)。 - 在测试用例中添加patch装饰器,通过side_effect自定义构造逻辑,仅替换需要mock的
value参数,其余参数保持原传入值不变。
代码示例
假设你的业务代码存放于business.py中,测试代码示例如下:
import unittest from unittest.mock import patch # 导入真实的MyObj类和业务函数 from business import generate_file, MyObj # 若MyObj定义在其他文件就从对应路径导入 class TestFileGenerate(unittest.TestCase): @patch("business.MyObj") # 此处填你确定的patch路径 def test_my_obj(self, mock_my_cls): # 定义side_effect拦截MyObj构造调用 def mock_constructor(*args, **kwargs): # 仅替换value为你需要的固定值,其余参数保持不变 kwargs["value"] = "YOUR_EXPECTED_FIXED_VALUE" # 调用真实的MyObj构造逻辑 return MyObj(*args, **kwargs) mock_my_cls.side_effect = mock_constructor # 以下是原有测试逻辑 config = {} # 从json等来源读取配置 generate_file(config) # 加载golden sample二进制 golden_sample_binary = b'' # 替换为实际加载逻辑 # 加载生成的二进制文件 with open("some_path", "rb") as f: generated_binary = f.read() assert golden_sample_binary == generated_binary if __name__ == "__main__": unittest.main()
注意事项
- 一定要保证patch的路径是
create_my_obj所在模块内引用的MyObj路径,否则mock不会生效 - 该方案不会修改
create_my_obj内的任何配置校验逻辑,也不会破坏MyObj的其他功能,仅修改指定参数,完全符合对比二进制文件的测试需求
内容的提问来源于stack exchange,提问作者ST Renegade
相关产品推荐
相关产品推荐

