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?
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
@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