测试一个类是否从另一个继承

Ren*_*cha 69 python unit-testing

这个问题比Django更相关.我想测试为这个函数写一个测试,我用它来动态地用我设置的字段获取Django表单.

def quiz_form_factory(question):
    properties = {
        'question': forms.IntegerField(widget=forms.HiddenInput, initial=question.id),
        'answers': forms.ModelChoiceField(queryset=question.answers_set)
    }
    return type('QuizForm', (forms.Form,), properties)
Run Code Online (Sandbox Code Playgroud)

我想测试是否,返回的QuizForm类继承自forms.Form.

就像是:

self.assertTrue(QuizForm isinheritedfrom forms.Form)  # I know this does not exist
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

paj*_*ton 108

使用issubclass(myclass,parentclass).

在你的情况下:

self.assertTrue( issubclass(QuizForm, forms.Form) )
Run Code Online (Sandbox Code Playgroud)

  • 旧线程,但为了完整性:bcdan是不正确的.至少在Python 3.x中,他给出的示例返回True,如文档所示. (8认同)
  • @bcdan的方法是`issubclass(C,A)`.我在Python 2.7上做了这个,它适用于新旧类型. (4认同)
  • 不幸的是,这不适用于多个继承深度. (2认同)
  • @Bo.我用子类测试了它.如果`class A`,`class B(A)`和`class C(B)`,`C.issubclass(A)`返回`False`.我可能得到的术语不正确,但我只是说这种技术性对于答案的完整性不起作用. (2认同)

jat*_*ism 5

你需要做的就是使用issubclass:

self.assertTrue(issubclass(QuizForm, forms.Form))
Run Code Online (Sandbox Code Playgroud)


bra*_*ers 5

使用内置issubclass功能.例如

issubclass(QuizForm, forms.Form)
Run Code Online (Sandbox Code Playgroud)

它返回一个bool,你可以直接使用它self.assertTrue()