0

unittest.TestCase私は、実際のテストクラスで定義されているメソッドが呼び出されるからクラスを派生させる次の構造を持っていますMyTests

import unittest

class TestCase1(unittest.TestCase):

    @classmethod
    def setUpClass(cls):  
        print cls.extra()

class TestCase2(TestCase1):

    @classmethod
    def setUpClass(cls):
        TestCase1.setUpClass()

class MyTests(TestCase1):

    @classmethod
    def extra(cls):
        return 42

    def test1(self):
        pass

if __name__ == '__main__':
    unittest.main()

上記のコードはそのままで、期待どおりに動作します。テストを実行すると、setUpClassで定義されたTestCase1が実行されます。extra()MyTests

TestCase2この問題は、代わりに使用したい場合TestCase1、つまり、次の行で「1」を「2」に変更した場合に発生します。

class MyTests(TestCase2): # using TestCase2 instead

が呼び出され、それ自体が基本クラスから呼び出される、つまりsetUpClassメソッドが実行されるという考え方です。ただし、属性エラーが発生します。TestCase2setUpClassTestCase1extra

AttributeError: type object 'TestCase1' has no attribute 'extra'

ここでいくつかの概念を誤解しているようです。私のコードはどちらの場合でも機能する (おそらく何らかのエラーがある) か、両方の場合で失敗することを期待していました。ここで何が間違っているのか、または問題を解決する方法についてのアイデアは大歓迎です。

4

2 に答える 2

2

その理由はTestCase2cls渡されたときに継承されているときTestCase1.setUpClass()に呼び出されたときに、メソッドTestCase1を持たない型だからです。extra()MyTests から呼び出されると、追加のメソッドを持つclsインスタンスになります。MyTests

superclsパラメータを からMyTests.setUpClass(cls)に渡しますTestCase1.setUpClass(cls)。に達するTestCase1clsextra()メソッドがあります。

于 2013-02-08T09:15:54.140 に答える
1

の代わりにsuperを使用することを強くお勧めしTestCase1.setUpClass()ます。

于 2013-02-08T09:01:38.963 に答える