21

エラーが発生する次のdjangoテストケースがあります。

class MyTesting(unittest.TestCase):
    def setUp(self):
        self.u1 = User.objects.create(username='user1')
        self.up1 = UserProfile.objects.create(user=self.u1)

    def testA(self):
        ...

    def testB(self):
        ...

テストを実行すると成功しますが、開始testAする前testBに次のエラーが発生します。

IntegrityError: column username is not unique

self.u1各テスト ケースの前に作成しようとしていて、データベースに既に存在していることがわかります。後続のケースが正しく実行されるように、各テスト ケースの後に適切にクリーンアップするにはどうすればよいですか?

4

3 に答える 3

29

setUpUnittestsのtearDownメソッドは、各テスト ケースの前後に呼び出されます。tearDown作成したユーザーを削除するメソッドを定義します。

class MyTesting(unittest.TestCase):
    def setUp(self):
        self.u1 = User.objects.create(username='user1')
        self.up1 = UserProfile.objects.create(user=self.u1)

    def testA(self):
        ...

    def tearDown(self):
        self.up1.delete()
        self.u1.delete()

また、ユーザーごとに手動でユーザー プロファイルを作成する場合を除き、signalを使用してユーザー プロファイルを作成することをお勧めします。post_save

コメント削除のフォローアップ:

Django ドキュメントから:

Django がオブジェクトを削除するとき、SQL 制約の ON DELETE CASCADE の動作をエミュレートします。つまり、 削除するオブジェクトを指す外部キーを持つオブジェクトはすべて一緒に削除されます。

あなたの場合、ユーザープロファイルはユーザーを指しているので、最初にユーザーを削除してプロファイルを同時に削除する必要があります。

于 2010-05-15T14:35:57.120 に答える
10

各テストの実行後にdjangoでテストデータベースを自動的にフラッシュする場合は、(現在行っているように)ではなく拡張する必要がありdjango.test.TestCaseますdjango.utils.unittest.TestCase

各テストの後にデータベースをダンプすることをお勧めします。これにより、テストの一貫性を確保できますが、この追加のオーバーヘッドにより、テストの実行速度が低下することに注意してください。

「WritingTests」DjangoDocsの警告セクションを参照してください。

于 2012-12-29T16:09:30.167 に答える
3

正確には、各テスト ケースの前に 1 回実行するというまさにその目的のためsetUpに存在します。

各テスト ケースの後に1 回実行される逆のメソッドは、名前が付けられtearDownています。ここで etc を削除します (オブジェクトを削除するだけでなく、追加の特別なクリーンアップ要件がない限り、self.u1おそらく を呼び出すだけです)。self.u1.delete()

于 2010-05-15T14:35:15.873 に答える