python - usuarios - ¿Cómo se puede crear un usuario administrador con Factory_Boy?
usuario y contraseña python (3)
Soy un principiante relativo de Django y acabo de empezar a hacer algunas pruebas para mis proyectos. Lo que quiero hacer es construir una prueba funcional con selenio que inicie sesión en el sitio de administración de Django.
Primero seguí este tutorial http://www.tdd-django-tutorial.com/tutorial/1/ y utilicé los accesorios y dumpdata para hacer que la información de la cuenta de administrador esté disponible para la aplicación de prueba (que crea una nueva base de datos). Esto funciona bien
Luego quise ver si puedo hacer lo mismo con el chico de fábrica para reemplazar los accesorios. Factory Boy funciona instanciando el objeto necesario dentro del archivo tests.py que me parece más limpio. De alguna manera no puedo hacer que esto funcione y la documentación de Factory_boy no es demasiado útil ...
Aquí está mi tests.py
from django.test import LiveServerTestCase
from django.contrib.auth.models import User
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import factory
class UserFactory(factory.Factory):
FACTORY_FOR = User
username = ''jeff''
password = ''pass''
is_superuser = True
class AdminTest(LiveServerTestCase):
def setUp(self):
self.browser = webdriver.Firefox()
def tearDown(self):
self.browser.quit()
def test_if_admin_login_is_possible(self):
jeff = UserFactory.create()
# Jeff opens the browser and goes to the admin page
self.browser = webdriver.Firefox()
self.browser.get(self.live_server_url + ''/admin/'')
# Jeff sees the familiar ''Django Administration'' heading
body = self.browser.find_element_by_tag_name(''body'')
self.assertIn(''Django administration'', body.text)
# Jeff types in his username and password and hits return
username_field = self.browser.find_element_by_name(''username'')
username_field.send_keys(jeff.username)
password_field = self.browser.find_element_by_name(''password'')
password_field.send_keys(jeff.password)
password_field.send_keys(Keys.RETURN)
# Jeff finds himself on the ''Site Administration'' page
body = self.browser.find_element_by_tag_name(''body'')
self.assertIn(''Site administration'', body.text)
self.fail(''Fail...'')
Esto no se puede iniciar sesión ya que de alguna manera no crea una cuenta de administrador válida. ¿Cómo puedo hacer eso usando el chico de fábrica? ¿Es posible o necesito usar accesorios para eso?
(En esta publicación, algunas personas sugirieron que los dispositivos son necesarios pero no surgió el fabricante de computadoras : cómo crear un usuario administrador en django tests.py . También probé la solución sugerida en la parte inferior de la misma respuesta: https: // stackoverflow. com / a / 3495219 / 1539688. No funcionó para mí ...)
Supongo que estás trabajando en el tutorial http://www.tdd-django-tutorial.com porque ahí es donde me quedé atascado también. Probablemente ya lo hayas descifrado, pero para la siguiente persona, aquí está el código que me funcionó, el truco fue agregar el método _prepare para asegurar que la contraseña esté encriptada, y establecer todas las banderas en verdadero (Esto se hizo con Django 1.5. 1, si está utilizando una versión anterior, cambie las importaciones del modelo de usuario)
from django.test import LiveServerTestCase
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import factory
from django.contrib.auth import get_user_model
User = get_user_model()
class UserFactory(factory.DjangoModelFactory):
FACTORY_FOR = User
email = ''[email protected]''
username = ''admin''
password = ''adm1n''
is_superuser = True
is_staff = True
is_active = True
@classmethod
def _prepare(cls, create, **kwargs):
password = kwargs.pop(''password'', None)
user = super(UserFactory, cls)._prepare(create, **kwargs)
if password:
user.set_password(password)
if create:
user.save()
return user
class PollsTest(LiveServerTestCase):
def setUp(self):
self.browser = webdriver.Firefox()
self.browser.implicitly_wait(3)
self.user = UserFactory.create()
def tearDown(self):
self.browser.quit()
def test_can_create_new_poll_via_admin_site(self):
self.browser.get(self.live_server_url+''/admin/'')
body = self.browser.find_element_by_tag_name(''body'')
self.assertIn(''Django administration'', body.text)
username_field = self.browser.find_element_by_name(''username'')
username_field.send_keys(self.user.username)
password_field = self.browser.find_element_by_name(''password'')
password_field.send_keys(''adm1n'')
password_field.send_keys(Keys.ENTER)
body = self.browser.find_element_by_tag_name(''body'')
self.assertIn(''Site administration'', body.text)
polls_links = self.browser.find_element_by_link_text(''Polls'')
self.assertEqual(len(polls_links), 2)
self.fail(''Finish the test!'')
Si crea una subclase factory.DjangoModelFactory, debe guardar el objeto del usuario por usted. Vea la sección de notas en PostGenerationMethodCall . Entonces solo necesitas hacer lo siguiente:
class UserFactory(factory.DjangoModelFactory):
FACTORY_FOR = User
email = ''[email protected]''
username = ''admin''
password = factory.PostGenerationMethodCall(''set_password'', ''adm1n'')
is_superuser = True
is_staff = True
is_active = True
Así es como lo hice con Factory Boy 2.7.0
y Django 1.8.4
. A continuación hay dos fábricas, una para un usuario básico y otra para el usuario administrador, que hereda de la básica y solo agrega los campos necesarios.
class UserFactory(DjangoModelFactory):
class Meta:
model = User
django_get_or_create = (''username'', ''email'', ''password'')
username = ''basic''
email = ''basic@tnot_admin.com''
password = ''basicpassword''
class AdminFactory(UserFactory):
username = ''admin''
is_superuser = True