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

Python使用unittest时如何mock create_my_obj内MyObj的入参?

实现方案

核心思路

使用unittest.mock.patch根据使用处路径mockMyObj类,通过side_effect拦截构造调用,替换指定参数后再调用真实的MyObj构造逻辑,既实现参数修改,又不破坏原有业务流程的真实性,不影响二进制生成对比的有效性。

具体实现步骤

  1. 确定patch路径:如果你的create_my_obj函数定义在my_module.py文件中,且该文件内是通过from xxx import MyObj导入的类,那么你需要patch的路径为my_module.MyObj(即create_my_obj所在模块内引用的MyObj)。
  2. 在测试用例中添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:06:04