1

したがって、テストできるモデルオブジェクトを作成するためのセットアップメソッドを持つテストクラスがあります。

class UserProjectTests(TestCase):

    fixtures = ['admin_test.json']

    def setUp(self):
        ...
        self.project1 = Project.objects.create(
            user=self.user_profile1,
            product=self.product1,
            module=self.module1,
            model=self.model1,
            zipcode=90210
        )
        self.project1.save()

    def test_module_created(self):
        ...

    def test_model_created(self):
        ...

    def test_product_created(self):
        ...

    def test_project_created(self):
        #! what happened to pk<4???
        result1 = Project.objects.get(pk=4)
        self.assertEquals(result1.zipcode, 90210)

    def test_user_cannot_edit_project_they_dont_own(self):
        ...

pk=4私の質問は、テスト データベースで唯一のオブジェクトを取得するために呼び出さなければならないのはなぜですか? このテストをいくつかの関数の上に移動すると、テストに合格するために照会する必要がある pk が減少します。pk が自動インクリメントされるため、セットアップが実行されるたびに未使用のデータベースで開始されないようです。

これがなぜなのか誰か教えてもらえますか?どのテスト関数に表示されるかに関係なく、pk=1 を使用できるようにするにはどうすればよいですか?

4

2 に答える 2

2

Django のテスト ランナーは、各テストの後にデータベースをフラッシュします。データベースを削除して再作成することはありません。これにより、テストが大幅に遅くなります。

pk 番号をハードコーディングするのではなく、最初の要素を求めることができます: Project.objects.all()[0]. 空のテーブルで各テスト ランを開始するため、必要な項目が確実に得られます。

于 2012-11-02T22:15:58.630 に答える
1

これがデータベース内の唯一のオブジェクトであることが本当に予想される場合は、次のように取得できます。

result1 = Project.objects.get()

複数の (または 1 つも) オブジェクトが見つからない場合、エラーが発生します。次のようにする方が安全かもしれません:

result1 = Project.objects.all()[-1]

これにより、最後のオブジェクトが取得されます。

于 2012-11-02T22:15:48.667 に答える