2013-03-12 33 views
5

Tôi đang sử dụng Django 1.5 và tôi đang cố gắng làm cho ứng dụng hoạt động với bất kỳ mô hình người dùng tùy chỉnh nào. Tôi đã thay đổi ứng dụng để sử dụng get_user_model ở mọi nơi và bản thân ứng dụng hiện không hiển thị bất kỳ sự cố nào.Thử nghiệm với mô hình người dùng tùy chỉnh dưới dạng ForeignKey ở Django 1.5

Vấn đề là tôi muốn có thể thử nghiệm ứng dụng, nhưng tôi không thể tìm cách tạo các trường mô hình ForeignKey để kiểm tra chính xác bằng cách sử dụng các mô hình người dùng tùy chỉnh. Khi tôi chạy test đính kèm dưới đây, tôi nhận được lỗi này:

ValueError: Cannot assign "<NewCustomUser: [email protected]>": "ModelWithForeign.user" must be a "User" instance. 

Đây là tập Tôi đang sử dụng để thử nghiệm:

from django.conf import settings 
from django.contrib.auth import get_user_model 
from django.contrib.auth.tests.custom_user import CustomUser, CustomUserManager 
from django.db import models 
from django.test import TestCase 
from django.test.utils import override_settings 

class NewCustomUser(CustomUser): 
    objects = CustomUserManager() 
    class Meta: 
     app_label = 'myapp' 

class ModelWithForeign(models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL) 

@override_settings(
    AUTH_USER_MODEL = 'myapp.NewCustomUser' 
) 
class MyTest(TestCase): 
    user_info = { 
     'email': '[email protected]', 
     'date_of_birth': '2013-03-12', 
     'password': 'password1' 
    } 

    def test_failing(self): 
     u = get_user_model()(**self.user_info) 
     m = ModelWithForeign(user=u) 
     m.save() 

Tôi đang tham khảo các mô hình sử dụng trong đối số ForeignKey danh sách như được mô tả here, nhưng sử dụng get_user_model không thay đổi bất kỳ điều gì vì thuộc tính user được đánh giá trước khi thay đổi cài đặt diễn ra. Có cách nào để làm cho ForeignKey này chơi tốt đẹp với thử nghiệm khi tôi đang sử dụng các mô hình người dùng tùy chỉnh?

Trả lời

3

Tôi đã hỏi về điều này trên danh sách gửi thư của Django nhưng có vẻ như, ít nhất hiện tại, không có cách nào để thay đổi settings.AUTH_USER_MODEL và hoạt động độc đáo với ForeignKey.

Cho đến nay, để thử nghiệm ứng dụng của tôi, tôi đã tạo một tệp runtests.py từ this answer:

import os, sys 
from django.conf import settings 

if len(sys.argv) >= 2: 
    user_model = sys.argv[1] 
else: 
    user_model = 'auth.User' 

settings.configure(
    ... 
    AUTH_USER_MODEL=user_model, 
    ... 
) 

... 

Và thêm một kịch bản bash để thực sự chạy thử nghiệm sử dụng mô hình sử dụng khác nhau:

for i in "auth.User" "myapp.NewCustomUser"; do 
    echo "Running with AUTH_USER_MODEL=$i" 
    python runtests.py $i 
    if [ $? -ne 0 ]; then 
     break 
    fi 
done 

Bit cuối cùng là sử dụng hàm để truy xuất thông tin mô hình người dùng phù hợp thay vì chỉ sử dụng biến "tĩnh":

def get_user_info(): 
    if settings.AUTH_USER_MODEL == 'auth.User': 
     return {default user info} 
    if settings.AUTH_USER_MODEL == 'myapp.NewCustomUser': 
     return {my custom user info} 
    raise NotImplementedError 

Tôi không tuyên bố đây là câu trả lời đúng cho vấn đề, nhưng cho đến nay ... Nó hoạt động.

+0

Điều này không liên quan đến thực tế rằng đó là cài đặt trên toàn trang web và không phải là cài đặt dành riêng cho ứng dụng? Giải pháp của bạn dường như có ý nghĩa khá tốt! – benjaoming

+1

@benjaoming nó thực sự là vì lược đồ không được xây dựng lại giữa các kiểm tra (và thực sự không nên), làm cho thuộc tính swappable vô dụng trong trường hợp này, vì nó định nghĩa bảng thực sự tồn tại. Bạn có thể trao đổi khá nhiều thứ khác và [tài liệu] (https://docs.djangoproject.com/en/dev/topics/testing/overview/#django.test.utils.override_settings) hiển thị một vài ví dụ về trang web cài đặt có thể bị ghi đè. – fcoelho

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