2012-04-17 18 views
5

Quando provo a testare parte del mio codice, ho bisogno di un utente per accedere. Per ridurre il numero di apparecchi sto usando django_factory_boy User factory ma l'utente generato non è in grado di autenticarsi .Autenticazione utente nei test con Django factory_boy

from django_factory_boy.auth import UserF 
from django.contrib.auth import authenticate 

user = UserF() 
user.set_password('password') 

poi authenticate(username=user.username, password='password') ritorno None invece dell'utente. Qualche idea su cosa manca qui?

risposta

3

È necessario chiamare user.save() dopo user.set_password() perché lo stesso set_password non salva l'utente, imposta solo i dati.

+0

Grazie! Alla fine ho trovato la soluzione ma non ho potuto rispondere a me stesso a causa della mia bassa reputazione. – sebastibe

8

Un altro modo per farlo:

import factory 
from django.contrib.auth.hashers import make_password 
from somewhere import YourUserModel 

class UserF(factory.django.DjangoModelFactory): 
    FACTORY_FOR = YourUserModel 
    first_name = factory.Sequence(lambda n: "First%s" % n) 
    last_name = factory.Sequence(lambda n: "Last%s" % n) 
    email = factory.Sequence(lambda n: "email%[email protected]" % n) 
    username = factory.Sequence(lambda n: "email%[email protected]" % n) 
    password = make_password("password") 
    is_staff = False 

>>> u = UserF.create() 
>>> u.check_password("password") 
True 

>>> p = UserF.create(password=make_password("password2")) 
>>> p.check_password("password2") 
True 
7

@ soluzione Andrew Magee-funziona, ma qui la soluzione describe in the doc: console

import factory 
from django.contrib.auth.models import User 
#or 
#from somewhere import CustomUser as User 

class UserFactory(factory.DjangoModelFactory): 
    FACTORY_FOR = User 

    username = 'UserFactory' 
    email = '[email protected]' 
    password = factory.PostGenerationMethodCall('set_password', 'password') 

Django:

>>> from tests.factories import UserFactory 
>>> from django.contrib.auth.models import check_password 
>>> user = UserFactory() 
>>> user.email 
'[email protected]' 
>>> check_password('password', user.password) 
True 

>>> user2 = UserFactory(username="SecondUserFactory", email='[email protected]', password="ComplexPasswordMuchLonger!") 
>>> user2.email 
'[email protected]' 
>>> check_password('ComplexPasswordMuchLonger!', user2.password) 
True 
+1

Preferisco anche questa soluzione. È chiaramente documentato in [factory_boy documentation] (https://factoryboy.readthedocs.org/en/latest/reference.html#factory.PostGenerationMethodCall) – Merwan

+0

grazie @Merwan, ho modificato il mio post –

Problemi correlati