30

私は比較的 Django の初心者で、自分のプロジェクトのテストを始めたところです。私がやりたいことは、Django Admin サイトにログインするセレンを使用した機能テストを構築することです。

最初にこのチュートリアルhttp://www.tdd-django-tutorial.com/tutorial/1/に従い、フィクスチャとダンプデータを使用して、テスト アプリ (新しいデータベースを作成する) で管理者アカウント情報を利用できるようにしました。これはうまくいきます。

次に、 factory-boyを使用して同じことができるかどうかを確認して、備品を交換したいと思いました。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 を使用してそれを行うにはどうすればよいですか? それは可能ですか、それともフィクスチャを使用する必要がありますか?

(この投稿では、一部の人々はフィクスチャが必要であると提案しましたが、工場の少年は出てきませんでした: How to create admin user in django tests.py。同じ回答の下部で提案されている解決策も試しました: https://stackoverflow. com/a/3495219/1539688 . 私にはうまくいきませんでした...)

4

6 に答える 6

50

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
于 2013-07-31T20:32:50.730 に答える
11

私は Django 1.11 (Django 2+ で動作することは間違いありません) と factory_boy 2.11.1 を使用しています。これは非常に簡単でした:

import factory
from django.contrib.auth.hashers import make_password
from django.contrib.auth.models import User


class SuperUserFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = User

    first_name = factory.Faker('first_name')
    last_name = factory.Faker('last_name')
    username = factory.Faker('email')
    password = factory.LazyFunction(lambda: make_password('pi3.1415'))
    is_staff = True
    is_superuser = True

この例では、すべてのユーザーのパスワードを'pi3.1415'変更する必要がある場合は、それに応じてパスワードを変更します。またはpassword = factory.Faker('password')、ランダムなパスワードを生成するために使用することもできます (ただし、それはあなたが理解できるものである必要があります。そうでない場合は、非常に困難になります)。ログインする)。

スーパーユーザーの作成例

>>> user = SuperUserFactory.create()
>>> user.username # the following output will be different in your case
amber60@hotmail.com

取得した電子メールuser.usernameとパスワード'pi3.1415'を使用して、管理者にログインします。

ユーザーに逆方向の外部キーが関連付けられている場合はどうなりますか?

簡単に言えば、モデルProfileへの外部キーを持つモデルがあるとしましょうUser。次に、次のクラスを追加する必要があります。

class Profile(models.Model):
    user = models.OneToOneField(User)
    visited = models.BooleanField(default=False)


# You need to set the foreign key dependency using factory.SubFactory
class ProfileFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Profile

    user = factory.SubFactory(UserFactory)


# use a RelatedFactory to refer to a reverse ForeignKey 
class SuperUserFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = User

    first_name = factory.Faker('first_name')
    last_name = factory.Faker('last_name')
    username = factory.Faker('email')
    password = factory.LazyFunction(lambda: make_password('pi3.1415'))
    is_staff = True
    is_superuser = True
    profile = factory.RelatedFactory(ProfileFactory, 'user', visited=True)

それだけです。例で同じロジックを使用して、スーパーユーザーを作成します。

于 2019-04-05T04:44:06.620 に答える