Как создать пользователя-администратора с помощью Factory_Boy?

Я относительный начинающий Django и просто начал выполнять некоторые тесты для своих проектов. Я хочу создать функциональный тест с селеном, который входит в сайт администратора Django.

Сначала я познакомился с этим учебным пособием http://www.tdd-django-tutorial.com/tutorial/1/ и использовал инструменты и дампдаты, чтобы сделать информацию учетной записи администратора доступной для тестового приложения (которое создает новую базу данных). Это прекрасно работает.

Затем я хотел посмотреть, смогу ли я сделать то же самое с заводским мальчиком, чтобы заменить светильники. Фабричный мальчик работает, создавая необходимый объект в файле tests.py, который кажется мне более чистым. Почему-то я не могу заставить это работать, и документация Factory_boy не слишком полезна …

Вот мой test.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...') 

Это не позволяет войти в систему, поскольку каким-то образом он не создает действительную учетную запись администратора. Как я могу это сделать с помощью заводского мальчика? Возможно ли, или мне нужно использовать светильники для этого?

(В этом посте некоторые люди предложили светильники, но заводский мальчик не появился: как создать пользователя admin в django tests.py . Я также попытался предложить решение, предложенное внизу в том же ответе: https: // stackoverflow. com / a / 3495219/1539688 . Это не сработало для меня …)

3 Solutions collect form web for “Как создать пользователя-администратора с помощью Factory_Boy?”

Если вы подклассифицируете factory.DjangoModelFactory, он должен сохранить объект пользователя для вас. См. Раздел примечания в разделе PostGenerationMethodCall . Тогда вам нужно только сделать следующее:

 class UserFactory(factory.DjangoModelFactory): FACTORY_FOR = User email = 'admin@admin.com' username = 'admin' password = factory.PostGenerationMethodCall('set_password', 'adm1n') is_superuser = True is_staff = True is_active = True 

Я предполагаю, что вы работаете над учебником http://www.tdd-django-tutorial.com, потому что именно там я тоже застрял. Вероятно, вы догадались об этом, но для следующего человека, вот код, который работал для меня, трюк добавлял метод _prepare для обеспечения шифрования пароля и установки всех флагов в true (это было сделано с Django 1.5. 1, если вы используете более раннюю версию, измените импорт модели пользователя)

 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 = 'admin@admin.com' 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!') 

Вот как я это сделал с Factory Boy 2.7.0 и Django 1.8.4 . Ниже представлены две фабрики: одна для базового пользователя и одна для администратора, которая наследует от базового добавления только необходимые поля.

 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 
  • Джанго с осколком и фантомами болезненно медленно
  • Отключение файлов cookie в Webdriver для Chrome / Firefox
  • Селен и iframe в html
  • Безголовый бесконечный свиток селена
  • Запуск Selenium Webdriver с прокси-сервером в Python
  • Selenium inested li div menu select () или click () python
  • Скремблирование «N» страниц с помощью Beautifulsoup и запросов (как получить истинный номер страницы)
  • Selenium python find_element_by_class_name () перестает работать с версии 2.2 до 2.21 - не может использовать 'Compound Class Name'
  • Python - лучший язык программирования в мире.