如何Mock Patch用于isinstance测试的类?求is_myclass函数测试方法
如何测试依赖isinstance判断的is_myclass函数
嗨,我来帮你搞定这个is_myclass函数的测试用例问题!首先得提个小细节:你的is_myclass函数目前没有返回值,得补上return语句才能正常工作,修正后的函数应该是这样:
def is_myclass(obj): """该荒诞存根为生产代码的简化版本。""" return isinstance(obj, MyClass) class MyClass: pass # 补全MyClass定义,否则代码无法正常运行
好了,回到正题——针对依赖isinstance判断的函数测试,Python的unittest.mock提供了三种实用方案,我一个个给你拆解,附上可直接运行的测试用例:
方案1:设置spec参数为真实类
当你创建mock对象时,通过spec参数指定真实的MyClass,这样mock对象会拥有和真实类一致的属性结构,isinstance判断会返回True。
测试用例示例:
import unittest from unittest.mock import MagicMock from your_module import is_myclass, MyClass # 替换为你的实际模块名 class TestIsMyClass(unittest.TestCase): def test_is_myclass_with_spec(self): # 创建spec为MyClass的mock对象 mock_obj = MagicMock(spec=MyClass) # 验证判断结果为True self.assertTrue(is_myclass(mock_obj)) def test_is_myclass_not_instance(self): # 非MyClass对象应返回False non_mock_obj = object() self.assertFalse(is_myclass(non_mock_obj)) if __name__ == '__main__': unittest.main()
方案2:直接赋值__class__属性给真实类
这种方法更直接——给mock对象的__class__属性赋值为真实的MyClass,让isinstance直接识别它为该类的实例。
测试用例示例:
import unittest from unittest.mock import MagicMock from your_module import is_myclass, MyClass class TestIsMyClass(unittest.TestCase): def test_is_myclass_with_class_attr(self): mock_obj = MagicMock() # 手动设置__class__属性 mock_obj.__class__ = MyClass self.assertTrue(is_myclass(mock_obj)) def test_is_myclass_not_instance(self): self.assertFalse(is_myclass(MagicMock()))
方案3:在patch真实类时使用spec参数
如果你的代码中是通过导入的方式使用MyClass,需要patch这个类的时候,可以在patch装饰器里指定spec=True,这样被patch后的类实例会满足isinstance判断。
测试用例示例:
import unittest from unittest.mock import patch from your_module import is_myclass, MyClass class TestIsMyClass(unittest.TestCase): @patch('your_module.MyClass', spec=True) def test_is_myclass_with_patch_spec(self, mock_myclass): # 创建被patch后的MyClass实例 mock_obj = mock_myclass() self.assertTrue(is_myclass(mock_obj)) def test_is_myclass_not_instance(self): self.assertFalse(is_myclass(object()))
这三种方案都能解决isinstance的mock判断问题,你可以根据自己的测试场景选择:如果只是需要单个mock对象,方案1或2更简单;如果需要patch整个类的调用,方案3更合适。
内容的提问来源于stack exchange,提问作者lemi57ssss
相关产品推荐
相关产品推荐

