2013-03-12 13 views
5

Używam Django 1.5 i staram się, aby aplikacja działała z dowolnym niestandardowym modelem użytkownika. Zmieniłem aplikację, by wszędzie była używana get_user_model, a sama aplikacja nie wyświetla żadnych problemów.Testowanie za pomocą niestandardowego modelu użytkownika jako klucza obcego w Django 1.5

Problem polega na tym, że chcę mieć możliwość przetestowania aplikacji, ale nie mogę znaleźć sposobu na sprawdzenie, czy pola modelu ForeignKey są poprawnie testowane przy użyciu niestandardowych modeli użytkowników. Kiedy uruchomić przypadek testowy załączony poniżej, otrzymuję ten błąd:

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

Jest to plik używam do testowania:

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() 

ja przedstawieniu modelu użytkownika w ForeignKey argumentu lista została opisana jako here, ale użycie get_user_model niczego nie zmienia, ponieważ atrybut user jest oceniany przed dokonaniem zmiany ustawień. Czy istnieje sposób na sprawienie, by gra ForeignKey była przyjemna podczas testowania, gdy korzystam z niestandardowych modeli użytkowników?

Odpowiedz

3

Zapytałem o to również na liście mailingowej Django, ale wydaje mi się, że przynajmniej obecnie nie ma możliwości zmiany settings.AUTH_USER_MODEL i sprawdzenie, czy działa dobrze z ForeignKey.

Jak dotąd, w celu sprawdzenia mojej aplikacji, mam utworzony plik runtests.py z 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, 
    ... 
) 

... 

I dodaje skrypt bash, aby rzeczywiście uruchomić testy z wykorzystaniem różnych modeli użytkowniczki:

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 

Ostatnim bitem jest użycie funkcji, aby pobrać właściwe informacje o modelu użytkownika, zamiast używać tylko "statycznej" zmiennej:

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 

Nie twierdzę, że jest to poprawna odpowiedź na problem, ale jak dotąd ... Działa.

+0

Czy to nie jest związane z faktem, że jest to ustawienie dla całej witryny, a nie ustawienie specyficzne dla aplikacji? Wydaje się, że rozwiązanie wydaje się całkiem sensowne! – benjaoming

+1

@benjaoming jest tak, ponieważ schemat nie jest przebudowywany między testami (i tak naprawdę nie powinien), co powoduje, że atrybut swappable jest bezużyteczny w tym przypadku, ponieważ określa, która tabela faktycznie istnieje. Możesz zamienić prawie wszystko, a [docs] (https://docs.djangoproject.com/en/dev/topics/testing/overview/#django.test.utils.override_settings) pokazuje kilka przykładów całej witryny ustawienia, które można przesłonić. – fcoelho

Powiązane problemy