为何Django模型测试中assertIsInstance失败而assertIs成功?
为什么
assertIsInstance测试失败但assertIs能通过? 你遇到的这个问题核心是对两个断言方法的作用理解偏差,咱们结合你的代码来拆解:
先搞懂两个断言的本质区别
assertIsInstance(a, b):它的作用是检查*a是b类(或b子类)的实例对象*。简单说,a得是用b类创建出来的具体对象,而b是类本身。assertIs(a, b):它的作用是检查*a和b是同一个对象*(内存地址完全一致),不管类型,只要是同一个实体就会通过。
结合你的代码分析
你的get_django_model函数返回的是模型类本身(比如models.Foo这个类对象),而不是这个类的实例(比如Foo.objects.create()生成的具体数据对象)。
当你写self.assertIsInstance(model_class, models.Foo)时,你其实在问:「models.Foo这个类,是不是models.Foo类的实例?」——这显然不成立,因为类的实例是它创建出来的对象,而类本身的类型是type(Python里所有类都是type的实例)。
而self.assertIs(model_class, models.Foo)是在问:「函数返回的类,和models.Foo是不是同一个类对象?」这刚好匹配你的函数逻辑(函数就是要返回对应模型类),所以测试直接通过了。
额外小验证
如果想验证返回的确实是一个类,你可以写:
self.assertIsInstance(model_class, type)
这会通过,因为Python里所有类都是type的实例。
内容的提问来源于stack exchange,提问作者dwvldg
相关产品推荐
相关产品推荐

