2012-04-17 22 views
5

Al intentar probar la unidad de una parte de mi código, necesito un usuario para iniciar sesión. Para reducir el número de dispositivos, uso django_factory_boy Fábrica de usuario pero el usuario generado no puede autenticarse .Autenticación del usuario en pruebas con Django factory_boy

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

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

continuación authenticate(username=user.username, password='password') retorno None en lugar del usuario. ¿Alguna idea sobre lo que falta aquí?

Respuesta

3

Debe llamar al user.save() después de user.set_password() porque el propio set_password no guarda al usuario, solo establece los datos.

+0

Gracias! Finalmente encontré la solución, pero no pude responderme por mi baja reputación. – sebastibe

8

Otra manera de hacerlo:

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

@ solución Andrew Magee-funciona, pero aquí la solución describe in the doc: consola

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

También prefiero esta solución. Está claramente documentado en [la documentación de factory_boy] (https://factoryboy.readthedocs.org/en/latest/reference.html#factory.PostGenerationMethodCall) – Merwan

+0

gracias @Merwan, edité mi publicación –

Cuestiones relacionadas