关于Python Mock框架构造函数打桩的问题求助
解决Python Mock构造函数打桩的问题
嘿,我一眼就看出问题出在哪了——你使用patch的方式不对!
当你直接调用mocker.patch('some_module.some_class')时,返回的并不是替换后的Mock对象本身,而是一个Patch实例(用来管理打桩生命周期的控制对象)。这就是为什么mock_class1 is some_module.some_class返回False的原因:前者是Patch管理对象,后者才是被替换到模块里的Mock实例。
下面给你三种正确的使用方式,任选其一都能解决你的问题:
方式一:使用上下文管理器(最推荐,自动清理)
这种方式会在with代码块内激活打桩,退出块时自动恢复原对象,无需手动清理:
import unittest.mock as mocker import some_module with mocker.patch('some_module.some_class') as mock_class1: print(mock_class1 is some_module.some_class) # 现在会返回True # 在这里编写测试逻辑,比如验证构造函数调用 some_module.some_class("test_param") mock_class1.assert_called_once_with("test_param")
方式二:作为测试函数的装饰器
如果你用unittest框架写测试,这种方式更简洁,装饰器会自动把Mock对象传入测试函数:
import unittest.mock as mocker import some_module import unittest class MyTestCase(unittest.TestCase): @mocker.patch('some_module.some_class') def test_constructor_call(self, mock_class1): print(mock_class1 is some_module.some_class) # 返回True # 调用被测试的逻辑,触发构造函数 some_module.create_instance() # 验证构造函数被正确调用 mock_class1.assert_called_once() if __name__ == '__main__': unittest.main()
方式三:手动启动/停止打桩(不推荐,容易遗漏清理)
如果必须手动控制生命周期,可以调用Patch对象的start()和stop()方法:
import unittest.mock as mocker import some_module # 创建Patch对象并启动打桩 patch_obj = mocker.patch('some_module.some_class') mock_class1 = patch_obj.start() print(mock_class1 is some_module.some_class) # 返回True # 执行测试逻辑 some_module.some_class() mock_class1.assert_called_once() # 必须手动停止打桩,恢复原对象 patch_obj.stop()
核心要点:patch的作用是替换指定路径下的对象,但你必须通过它提供的上下文、装饰器或手动启动的方式,才能拿到真正用于断言和验证的Mock实例,而不是直接用patch()的返回值。
内容的提问来源于stack exchange,提问作者Sebastian Yonekura Baeza
相关产品推荐
相关产品推荐

