python Factory_Boy로 관리자를 어떻게 생성 할 수 있습니까?




django factory model (3)

나는 장고 초보자이며 프로젝트를 테스트하기 시작했습니다. 내가 뭘하고 싶은 건지 장고 관리자 사이트에 로그인 셀렌과 기능 테스트를 구축합니다.

먼저이 튜토리얼 http://www.tdd-django-tutorial.com/tutorial/1/을 따르고 fixtures 및 dumpdata를 사용하여 테스트 응용 프로그램 (새 데이터베이스를 만드는)에 사용할 수있는 관리자 계정 정보를 만들었습니다. 이것은 잘 작동합니다.

나는 그 다음에 내가 공장 소년 을 사용해 비품을 대체 할 수 있는지보고 싶었다. Factory Boy는 tests.py 파일 내에서 필요한 객체를 인스턴스화하여 작동합니다. 어떻게 든이 작업을 얻을 수 없으며 Factory_boy 문서가 도움이되지 않습니다 ...

내 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...')

이것은 어떤 식 으로든 유효한 관리 계정을 만들지 못하는 것처럼 로그인하지 못합니다. 공장 소년을 사용하면 어떻게 할 수 있습니까? 그것은 가능합니까 아니면 그것을 위해 비품을 사용해야합니까?

(이 게시물에서 일부 사람들은 비품이 필요하다고 제안했지만 factory boy는 나오지 않았다 : django tests.py에서 admin 사용자를 생성하는 방법 . 같은 해결책의 맨 아래에 제안 된 해결책을 시도했다. https : // stackoverflow. co.kr / a / 3495219 / 1539688. 나를 위해 작동하지 않았다 ...)


Answer #1

다음은 Factory Boy 2.7.0Django 1.8.4 작업을 수행 한 방법입니다. 아래에는 두 개의 팩토리가 있습니다. 하나는 기본 사용자 용이고 다른 하나는 관리 사용자 용이고 기본은 필요한 필드 만 추가하는 것부터 상속받습니다.

class UserFactory(DjangoModelFactory):

    class Meta:
        model = User
        django_get_or_create = ('username', 'email', 'password')

    username = 'basic'
    email = '[email protected]_admin.com'
    password = 'basicpassword'


class AdminFactory(UserFactory):
    username = 'admin'
    is_superuser = True

Answer #2

factory.DjangoModelFactory를 하위 클래스로 만들면 사용자 객체를 저장해야합니다. PostGenerationMethodCall 의 노트 섹션을 참조하십시오. 그렇다면 다음을 수행하기 만하면됩니다.

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

Answer #3

나는 당신이 http://www.tdd-django-tutorial.com 튜토리얼에서 일하고 있다고 가정하고있다 . 왜냐하면 그것이 내가 붙어있는 곳이기 때문이다. 당신은 아마도 이것을 지금 알았을 것입니다.하지만 다음 사람에게는 저에게 도움이되는 코드가 있습니다. 트릭은 _prepare 메서드를 추가하여 암호가 암호화되어 있는지 확인하고 모든 플래그를 true로 설정하는 것입니다 (이것은 장고 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 = '[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!')




factory-boy