2013-03-12 11 views
5

Uso Django 1.5 e sto provando a far funzionare un'applicazione con qualsiasi modello utente personalizzato. Ho modificato l'app per utilizzare get_user_model ovunque e l'app non presenta alcun problema fino a quel momento.Test con un modello utente personalizzato come ForeignKey in Django 1.5

Il problema è che voglio essere in grado di testare l'app, ma non riesco a trovare un modo per testare correttamente i campi del modello ForeignKey utilizzando modelli utente personalizzati. Quando eseguo il banco di prova di seguito allegata, ottengo questo errore:

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

Questo è il file che sto utilizzando per il test:

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

Sto riferimento al modello di utente nell'argomento ForeignKey elencare come descritto here, ma utilizzando get_user_model non viene modificato nulla, poiché l'attributo user viene valutato prima che avvenga la modifica dell'impostazione. C'è un modo per far suonare questo ForeignKey con i test quando utilizzo modelli utente personalizzati?

risposta

3

Ho chiesto informazioni sulla mailing list di Django, ma sembra che, almeno attualmente, non sia possibile modificare lo settings.AUTH_USER_MODEL e farlo funzionare correttamente con uno ForeignKey.

Finora, al fine di testare la mia app, ho creato un file runtests.py da 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, 
    ... 
) 

... 

e ha aggiunto uno script bash per eseguire effettivamente i test utilizzando diversi modelli di utente:

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 

l'ultimo pezzo è quello di utilizzare una funzione per recuperare realmente il diritto informazioni modello di utente invece di utilizzare una variabile "statico":

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 

Non sto sostenendo che questa sia una risposta corretta per il problema, ma finora ... Funziona.

+0

Non è correlato al fatto che si tratta di un'impostazione a livello di sito e non di un'impostazione specifica dell'app? La soluzione sembra avere un buon senso! – benjaoming

+1

@benjaoming in realtà perché lo schema non viene ricostruito tra i test (e in realtà non dovrebbe), il che rende inutilizzabile l'attributo swappable in questo caso, poiché definisce quale tabella esiste realmente. Puoi scambiare praticamente qualsiasi altra cosa e i [documenti] (https://docs.djangoproject.com/en/dev/topics/testing/overview/#django.test.utils.override_settings) mostrano alcuni esempi di larghezza del sito impostazioni che possono essere sovrascritte. – fcoelho

Problemi correlati