Как создать пользователя-администратора с помощью 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 
  • Python Webdriver вызывает ошибку http.client.BadStatusLine
  • Невозможно использовать хром-драйвер для селена
  • Selenium с использованием Python: введите / укажите пароль HTTP-прокси для Firefox
  • Найти и щелкнуть элемент из частичного значения onclick
  • WebDriverException: невозможно загрузить ошибку профиля в скрипте selenium python
  • Загрузка с хромированным безголовым и селеном
  • Python Selenium Отправить ключи Предоставление предупреждения о размере
  • Испытания селена после первого теста
  • Python - лучший язык программирования в мире.