3

2 つのモデル:

class Model1(models.Model):
    attribute = models.CharField(max_length=100)

class Model2(models.Model):
    target = models.ForeignKey(Model1)

そして単体テストtests.py

class Model1Test(TestCase):
    def test_make_new_model_and_save():
        m = Model1()
        m.attribute = 'test values'
        m.save()

class Model2Test(TestCase):
    def test_make_new_model_and_save():
        # Make new Model1 to FK to
        m = Model1()
        m.attribute = 'test values'
        m.save()   

        m2 = Model2()
        m2.target = m
        m2.save()

Model2 をテストするためにコードを再度複製するのではなく、Model1 のテスト クラス内で定義された unittest 関数を呼び出したいと思います。これは次のようになると思います:

class Model1Test(TestCase):
    def test_make_new_model_and_save():
        m = Model1()
        m.attribute = 'test values'
        m.save()
        return m

class Model2Test(TestCase):
    def test_make_new_model_and_save():
        # Make new Model1 to FK to
        m = Model1Test('test_make_new_model_and_save')

        m2 = Model2()
        m2.target = m
        m2.save()

しかし、これは機能していないようで、すぐに単体テスト フレームワークの内部にいることに気付きます。この種のことへの言及があまり見つからないので、単体テストに慣れていないので、どこかで間違った方向に進んだと感じています。

単体テストを再利用する「通常の」方法はありますか、それとも私のアプローチに欠陥がありますか?

4

2 に答える 2

3

これは、Python のオブジェクトとクラスに関する単なる質問です。答えは、必要な初期化コードを含む共通のスーパークラスを定義し、そこから Model1Test と Model2Test の両方を継承し、両方から呼び出すことです。

class CommonSetUp(TestCase):
    def make_new_model_and_save():
        m = Model1()
        m.attribute = 'test values'
        m.save()
        return m

class Model2Test(CommonSetUp):
    def test_make_new_model_and_save():
        self.make_new_model_and_save()
        self.assertTrue(...your assertions here...)

class Model2Test(CommonSetUp):
    def test_make_new_model_and_save():
        self.make_new_model_and_save()

        m2 = Model2()
        m2.target = m
        m2.save()

        self.assertTrue(...your assertions here...)
于 2012-08-02T14:46:32.730 に答える
0

別のテスト メソッド内でテスト メソッドを呼び出すことはお勧めしません。
それは混乱を招き、しばらくするとテストが不安定になり、修正や保守が難しくなります。

于 2012-08-02T19:29:00.690 に答える