2013-08-22 18 views
6

Tôi đã viết bài kiểm tra Django bằng django.test.TestCase và tôi muốn sử dụng lịch thi đấu với tất cả dữ liệu cơ sở dữ liệu hiện tại của mình để chạy thử nghiệm. Tuy nhiên, nếu tôi có thể tạo các vật cố như sau:Kiểm tra Django manage.py không thể tải lịch thi đấu đúng

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

khi tôi sau đó chạy các bài kiểm tra sử dụng python manage.py test myapp, tôi nhận được lỗi sau:

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. 

Tôi đọc ở đâu đó trên SO rằng điều này có thể được gây ra bởi một cuộc xung đột pk vì vậy tôi sau đó đã cố gắng tái tạo các vật cố với:

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

Nhưng bây giờ chạy thử nghiệm mang lại cho tôi:

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

Tôi cũng đã thử nhiều cách khác nhau trừ (sử dụng tùy chọn --exclude) auth.permissioncontenttypes (hoặc cả hai cùng một lúc), nhưng sau đó tôi nhận được khiếu nại về quyền mất tích (Key (permission_id)=(44) is not present in table "auth_permission".) hoặc thiếu các loại nội dung (DeserializationError: ContentType matching query does not exist.)

Các vấn đề là, tôi cần quyền, bởi vì các thử nghiệm của tôi là một phần để xác minh rằng chỉ những người dùng có quyền cụ thể mới có thể truy cập một số chế độ xem nhất định.

Tôi không hiểu tại sao điều này xảy ra, thành thật - ấn tượng của tôi là người chạy thử nghiệm bắt đầu với cơ sở dữ liệu hoàn toàn sạch sẽ và tải mọi thứ từ vật cố của tôi, nhưng đọc các bài đăng như thế này: Django unit-testing with loading fixtures for several dependent applications problems như có thể không phải vậy.

Làm cách nào để giải quyết vấn đề này? Tôi muốn có nhiều thay không phải viết những thứ như User.objects.create_user(.. tấn lần dưới def setUp(self): trong các thử nghiệm của tôi chỉ để có đủ các đối tượng cho họ để chạy đúng ...

Trả lời

3

Khi bạn chạy một thử nghiệm initial_data fixtures will be loaded (by syncdb).

Đối với tôi dumpdata làm việc với đối số --natural, ngoại trừ contenttypes và sau đó xóa một số auth.permission mục bằng tay mà chỉ có những vẫn còn:

{ 
    "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" 
     ] 
    } 
}, 

Tôi không hiểu excactly tại sao, nhưng nó hoạt động. Tôi sẽ cố gắng so sánh vật cố của tôi với một bãi chứa cơ sở dữ liệu mới ngay sau syncdb và quyết định sau đó những gì cần xóa hoặc chỉnh sửa trong lịch thi đấu của tôi. Hy vọng điều này sẽ giúp trong trường hợp của bạn.

1

Vấn đề này dường như vẫn còn hiện diện, ngay cả với - tự nhiên. Tuy nhiên, có vẻ như được giải quyết trong django1.9 với cờ mới: dumpdata --natural-foreign --natural-primary

thấy https://code.djangoproject.com/ticket/21278#comment:5

+1

Đối với bất cứ ai tìm kiếm này với một vấn đề tương tự, đây là một cái nhìn sâu sắc KEY: nếu bạn mô hình chứa một mối quan hệ M2M, KHÔNG đổ bảng M2M vào lịch thi đấu của bạn! Nếu không, M2M đầu tiên sẽ được điền khi các đối tượng liên quan được tạo ra, và sau đó LẠI khi dữ liệu M2M được nạp từ vật cố, do đó gây ra lỗi toàn vẹn. – powderflask

Các vấn đề liên quan