如何在创建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"] == "自定义指定字符串"
关键细节说明
- patch路径规则:
mock.patch('src.config.settings.Settings.some_thing')必须指向Settings类被测试模块导入的路径,而非类定义的原文件路径,这是Python mock遵循的"使用位置优先"原则。 - mock返回值控制:通过
mock_some_thing.return_value设置任意需要的字符串,当Settings的get_defaults调用self.some_thing()时,会直接返回该指定值,完全跳过原方法逻辑。 - 装饰器参数传递:被
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
相关产品推荐
相关产品推荐

