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

Python unittest如何在TestCase基类中统一mock指定函数

问题原因与解决方案

核心错误点

你当前的实现存在两个关键错误:

  1. patch参数使用错误:patch("runner.runner.is_production", True)的第二个参数是new替换对象,相当于直接把目标函数替换为布尔值True,而非可调用的Mock对象,不符合使用预期。你需要指定的是return_value参数而非直接传返回值。
  2. setup与清理逻辑不匹配:setUp是每个测试用例执行前运行的实例方法,而addClassCleanup是类所有测试执行完毕后才触发的类级清理逻辑,二者混用会导致patch提前失效,没有正确替换目标函数。

正确实现方案

方案1:类级别全局patch(推荐,全类所有测试用例共享mock)

所有继承该基类的测试类,所有用例默认mock返回True,不需要重复配置:

from unittest.mock import patch
from unittest import TestCase

class ProductionTestCase(TestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        # 指定return_value参数设置mock返回值
        cls.patcher = patch("runner.runner.is_production", return_value=True)
        cls.is_production_mock = cls.patcher.start()
        # 类级别清理,所有测试跑完再停止patch
        cls.addClassCleanup(cls.patcher.stop())

方案2:实例级别patch(每个测试用例独立隔离mock)

适合需要每个用例单独重置mock状态的场景:

class ProductionTestCase(TestCase):
    def setUp(self):
        super().setUp()
        self.patcher = patch("runner.runner.is_production", return_value=True)
        self.is_production_mock = self.patcher.start()
        # 实例级别清理,每个用例跑完就重置mock
        self.addCleanup(self.patcher.stop())

灵活调整返回值

如果某个测试用例需要修改返回值为False,直接在测试方法内修改mock的return_value即可:

class Production(ProductionTestCase):
    def test_non_production_scene(self):
        # 单独修改当前用例的mock返回值
        self.is_production_mock.return_value = False
        # 后续测试逻辑
        ...

补充验证点

如果修改后仍然出现原函数被调用的情况,确认runner.runner模块中is_production的导入方式:

  • 如果是from runner.utils import is_production,你当前patch的runner.runner.is_production路径正确
  • 如果是import runner.utils,调用时用utils.is_production(),则需要将patch路径改为runner.utils.is_production

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 15:06:03