4

djangoプロジェクトで次の単体テストを実行しようとしています。

from django.test import TestCase
from django.contrib.auth.models import User
from CarbonEmissions import models

class DbTest(TestCase):
    #is called before each test case (e.g test_insertingUserProfiles)
    def setUp(self):
        self.user = User.objects.create(username='ppoliani')
        self.userProfile = models.UserProfile.objects.create(user=self.user, title='Mr', type='student', occupation='student')

    def test_insertingUserProfiles(self):
        """
            Testing the insertion of user profiles into our datbase 
        """
        self.assertEqual(self.user.get_profile().title,'Mr')

    #is called after each test case (e.g test_insertingUserProfiles)
    def tearDown(self):
        self.user.delete()
        self.userProfile.delete()

テストは失敗し、次のエラーがスローされます。

IntegrityError: duplicate key value violates unique constraint "CarbonEmissions_userprofile_user_id_key" DETAIL:  Key (user_id)=(1) already exists.

そのコードの何が問題なのか理解できません。

4

4 に答える 4

2

エラー メッセージは、制約 "CarbonEmissions_userprofile_user_id_key" が失敗したことを示しています。これは、一部のテーブルに user_id が 1 に等しい行が既に存在するためです。

これを修正するには、通常 PostgreSQL と一緒にインストールされる pgAdminIII を使用して制約とデータを調べるのが最も簡単かもしれません。テーブル名を展開して、列、制約などを表示します。制約を展開して、その名前とプロパティを表示します。テーブル名を右クリックし、[データの表示] を選択して、データを参照できるオプションを表示します。

于 2012-08-11T15:10:56.713 に答える
0

完全なスタックトレースを投稿していませんが(してください!)、エラーはUserProfileオブジェクトを作成する行にあると思います。Djangoのドキュメントでは、でプロファイルクラスを指定しても、新しいユーザーを追加してもそのタイプのモデルは自動的に作成されないと明示的に述べています。AUTH_PROFILE_MODULE

get_profile()メソッドは、プロファイルが存在しない場合、プロファイルを作成しません。ユーザーモデルのdjango.db.models.signals.post_saveシグナルのハンドラーを登録する必要があります。ハンドラーで、createdがTrueの場合、関連するユーザープロファイルを作成します。

したがって、zifotが示唆しているように、プロジェクトにはおそらく他のコードがあり、を作成していUserProfileます。正しく機能している場合は、self.userProfile = models.UserProfile.objects.create(...から行を削除して、次の方法setUpでプロファイルにアクセスします。

self.user.get_profile()
于 2012-08-11T23:09:46.107 に答える
0

ユーザー オブジェクトの post_save シグナルをリッスンするコードによって、ユーザー プロファイル オブジェクトが既に作成されている可能性があります。その場合、setUp 関数で作成しているプロファイルは重複しています。

于 2012-08-11T22:01:33.973 に答える