2013-08-22 18 views
6

django.test.TestCaseを使用してDjangoテストを作成しました。テストを実行するために現在のデータベースのすべてのデータを含むフィクスチャを使用したいと思います。次のように私は、フィクスチャを作成する場合は、:Django manage.pyテストでフィクスチャを正しく読み込むことができません

python manage.py dumpdata --indent=3 > myapp/fixtures/test_data.json 

を、私はその後、python manage.py test myappを使用してテストを実行したときに、私は次のエラーを取得する:

Problem installing fixture...(traceback) 
IntegrityError: Could not load auth.Permission(pk=42): duplicate key value violates unique constraint "auth_permission_content_type_id_codename_key" 
DETAIL: Key (content_type_id, codename)=(14, add_record) already exists. 

これはによって引き起こされるかもしれないので、私がどこかで読んで私が与える

python manage.py dumpdata --natural --indent=3 > myapp/fixtures/test_data.json 

しかし、今のテストを実行している:PKの競合は、私は、その後でフィクスチャを再作成しようとした

Problem installing fixture...(traceback) 
DeserializationError: 'NoneType' object has no attribute '_meta' 

私もいろいろ除く(--excludeオプションを使用して)auth.permissioncontenttypes(または同時に両方)を試みたが、その後、私は(DeserializationError: ContentType matching query does not exist.)不足している権限(Key (permission_id)=(44) is not present in table "auth_permission".)または欠落しているコンテンツの種類についての苦情を取得

私のテストは、特定の権限を持つユーザーだけが特定のビューにアクセスできるかどうかを確認するためのものです。

正直言って、なぜこのようなことが起こっているのか分かりません。私の印象は、テストランナーが完全にクリーンなデータベースから始まり、すべてのものをロードしていますが、この1つのような投稿を読む:Django unit-testing with loading fixtures for several dependent applications problems多分それはそうでないかもしれません。

どうすればこの問題を回避できますか?あなたがテストinitial_data fixtures will be loaded (by syncdb)を実行すると、私はむしろ...

答えて

3

それらを適切に実行するために必要なだけのオブジェクトを持っている私のテストでdef setUp(self):下倍の User.objects.create_user(..トンのようなものを書く必要はありませんと思います。 --natural引数で動作しますdumpdata私にとって

contenttypes除くその後、これらのみが残っていることを手動でいくつかのauth.permissionエントリを削除:

{ 
    "pk": 1, 
    "model": "auth.permission", 
    "fields": { 
     "codename": "add_permission", 
     "name": "Can add permission", 
     "content_type": [ 
      "auth", 
      "permission" 
     ] 
    } 
}, 
{ 
    "pk": 2, 
    "model": "auth.permission", 
    "fields": { 
     "codename": "change_permission", 
     "name": "Can change permission", 
     "content_type": [ 
      "auth", 
      "permission" 
     ] 
    } 
}, 
{ 
    "pk": 3, 
    "model": "auth.permission", 
    "fields": { 
     "codename": "delete_permission", 
     "name": "Can delete permission", 
     "content_type": [ 
      "auth", 
      "permission" 
     ] 
    } 
}, 
{ 
    "pk": 4, 
    "model": "auth.permission", 
    "fields": { 
     "codename": "add_group", 
     "name": "Can add group", 
     "content_type": [ 
      "auth", 
      "group" 
     ] 
    } 
}, 
{ 
    "pk": 5, 
    "model": "auth.permission", 
    "fields": { 
     "codename": "change_group", 
     "name": "Can change group", 
     "content_type": [ 
      "auth", 
      "group" 
     ] 
    } 
}, 
{ 
    "pk": 6, 
    "model": "auth.permission", 
    "fields": { 
     "codename": "delete_group", 
     "name": "Can delete group", 
     "content_type": [ 
      "auth", 
      "group" 
     ] 
    } 
}, 
{ 
    "pk": 7, 
    "model": "auth.permission", 
    "fields": { 
     "codename": "add_user", 
     "name": "Can add user", 
     "content_type": [ 
      "auth", 
      "user" 
     ] 
    } 
}, 
{ 
    "pk": 8, 
    "model": "auth.permission", 
    "fields": { 
     "codename": "change_user", 
     "name": "Can change user", 
     "content_type": [ 
      "auth", 
      "user" 
     ] 
    } 
}, 
{ 
    "pk": 9, 
    "model": "auth.permission", 
    "fields": { 
     "codename": "delete_user", 
     "name": "Can delete user", 
     "content_type": [ 
      "auth", 
      "user" 
     ] 
    } 
}, 
{ 
    "pk": 10, 
    "model": "auth.permission", 
    "fields": { 
     "codename": "add_contenttype", 
     "name": "Can add content type", 
     "content_type": [ 
      "contenttypes", 
      "contenttype" 
     ] 
    } 
}, 
{ 
    "pk": 11, 
    "model": "auth.permission", 
    "fields": { 
     "codename": "change_contenttype", 
     "name": "Can change content type", 
     "content_type": [ 
      "contenttypes", 
      "contenttype" 
     ] 
    } 
}, 
{ 
    "pk": 12, 
    "model": "auth.permission", 
    "fields": { 
     "codename": "delete_contenttype", 
     "name": "Can delete content type", 
     "content_type": [ 
      "contenttypes", 
      "contenttype" 
     ] 
    } 
}, 
{ 
    "pk": 13, 
    "model": "auth.permission", 
    "fields": { 
     "codename": "add_session", 
     "name": "Can add session", 
     "content_type": [ 
      "sessions", 
      "session" 
     ] 
    } 
}, 
{ 
    "pk": 14, 
    "model": "auth.permission", 
    "fields": { 
     "codename": "change_session", 
     "name": "Can change session", 
     "content_type": [ 
      "sessions", 
      "session" 
     ] 
    } 
}, 
{ 
    "pk": 15, 
    "model": "auth.permission", 
    "fields": { 
     "codename": "delete_session", 
     "name": "Can delete session", 
     "content_type": [ 
      "sessions", 
      "session" 
     ] 
    } 
}, 
{ 
    "pk": 16, 
    "model": "auth.permission", 
    "fields": { 
     "codename": "add_site", 
     "name": "Can add site", 
     "content_type": [ 
      "sites", 
      "site" 
     ] 
    } 
}, 
{ 
    "pk": 17, 
    "model": "auth.permission", 
    "fields": { 
     "codename": "change_site", 
     "name": "Can change site", 
     "content_type": [ 
      "sites", 
      "site" 
     ] 
    } 
}, 
{ 
    "pk": 18, 
    "model": "auth.permission", 
    "fields": { 
     "codename": "delete_site", 
     "name": "Can delete site", 
     "content_type": [ 
      "sites", 
      "site" 
     ] 
    } 
}, 

私はなぜexcactly理解していないが、それは動作します。私はsyncdbの直後に新しいデータベースのダンプと私のフィクスチャを比較して、私のフィクスチャで何を削除したり編集したりするかを決めようとしています。あなたの場合にこれが役立つことを願っています。

1

- 自然であっても問題はまだ存在しているようです。 はしかし、新しいフラグとdjango1.9で解決しているように見える:あなたのモデルは、M2Mの関係が含まれている場合、 : dumpdata --natural-foreign --natural-primary

は、同様の問題でこれを見つけ、誰のためにhttps://code.djangoproject.com/ticket/21278#comment:5

+1

を参照してください、ここで重要な洞察力ですあなたのテストフィクスチャにM2Mテーブルをダンプしないでください!それ以外の場合は、関連するオブジェクトが作成されたときにM2Mが最初に生成され、M2Mデータがフィクスチャからロードされると再び整合性エラーが発生します。 – powderflask

関連する問題