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

如何在创建Settings类实例前Mock其some_thing方法并指定返回值?

如何Mock Settings类的some_thing方法并指定返回值

要在单元测试的setUp方法中创建Settings实例前,跳过some_thing方法的实际执行并返回指定字符串,可以通过unittest.mock.patch实现,具体方案如下:

修改后的测试模块代码

使用@mock.patch装饰setUp方法,在实例化Settings前替换目标方法:

"""
Unit tests for settings module
"""
import unittest
import unittest.mock as mock

from src.config.settings import Settings


class TestSettings(unittest.TestCase):
    """ Class containing tests for settings module """

    @mock.patch('src.config.settings.Settings.some_thing')
    def setUp(self, mock_some_thing):
        """ Use this method to setup the tests """
        # 指定mock方法的返回值
        mock_some_thing.return_value = "自定义指定字符串"
        
        print() # 仅用于pytest输出时换行
        self.settings = Settings()


    def test_get_settings_file(self):
        """
        Tests get settings file
        """
        assert self.settings.settings_file == r"C:\users\root\.settings.json"

    def test_default_settings_uses_mocked_value(self):
        """验证默认设置使用了mock返回的值"""
        assert self.settings.settings["other_path"] == "自定义指定字符串"

关键细节说明

  1. patch路径规则:mock.patch('src.config.settings.Settings.some_thing')必须指向Settings类被测试模块导入的路径,而非类定义的原文件路径,这是Python mock遵循的"使用位置优先"原则。
  2. mock返回值控制:通过mock_some_thing.return_value设置任意需要的字符串,当Settings的get_defaults调用self.some_thing()时,会直接返回该指定值,完全跳过原方法逻辑。
  3. 装饰器参数传递:被patch装饰的方法会自动接收一个mock对象参数(此处为mock_some_thing),通过它可以灵活控制mock的行为。

备选实现方式(上下文管理器)

如果不想用装饰器,也可以在setUp中用上下文管理器临时mock:

def setUp(self):
    """ Use this method to setup the tests """
    print()
    # 临时mock some_thing方法
    with mock.patch('src.config.settings.Settings.some_thing') as mock_some_thing:
        mock_some_thing.return_value = "自定义指定字符串"
        # 在上下文内实例化Settings,此时some_thing已被mock
        self.settings = Settings()

这种方式会将mock的作用范围限制在with块内,离开块后原方法自动恢复,但由于Settings实例化时已保存了mock生成的设置值,后续测试方法仍可正常使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 08:52:27