如何用MagicMock绕过issubclass检查?
解决MagicMock实例无法通过issubclass断言的问题
问题原因
issubclass()要求第一个参数必须是类对象,但你用MagicMock(spec_set=B)创建的mock_B是B类的实例mock,本质是实例而非类,因此触发TypeError。
解决方案
如果你需要让issubclass(mock_B, A)断言通过,必须让mock对象模拟类本身,而非类的实例,有两种可行方式:
方式1:手动设置mock的继承关系
通过给MagicMock指定__bases__属性,明确它的父类:
from unittest.mock import MagicMock class A: pass class B(A): pass # 创建模拟类的mock,指定父类为A mock_B = MagicMock(spec_set=B, __bases__=(A,)) assert issubclass(mock_B, A) # 断言通过
方式2:使用create_autospec自动继承类结构
create_autospec会自动保留原类的继承关系和结构,无需手动设置:
from unittest.mock import create_autospec class A: pass class B(A): pass # 生成类的mock,自动继承B的继承关系 mock_B = create_autospec(B, spec_set=True) assert issubclass(mock_B, A) # 断言通过
补充说明
如果你实际需求是检查实例的类型(而非类的继承),应该使用isinstance而非issubclass,此时原代码的实例mock可以直接通过断言:
mock_B_instance = MagicMock(spec_set=B) assert isinstance(mock_B_instance, A) # 断言自动通过
内容的提问来源于stack exchange,提问作者Intrastellar Explorer
相关产品推荐
相关产品推荐

