首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django测试-使用create_batch的用户工厂

Django测试-使用create_batch的用户工厂
EN

Stack Overflow用户
提问于 2021-04-20 11:20:16
回答 3查看 837关注 0票数 0

好的,我的测试文件遇到了有趣的问题。

我使用这个简单的代码来检查UserFactory创建的用户

代码语言:javascript
运行
复制
UserFactory.create_batch(4)

for u in User.objects.all():
    print(u.email)

UserFactory -这是很好的

create_batch(4)进程中创建4个用户

代码语言:javascript
运行
复制
from django.contrib.auth import get_user_model
from factory import Faker
from factory.django import DjangoModelFactory

class UserFactory(DjangoModelFactory):
    email = Faker("email")
    password = Faker(
        "password",
        length=42,
        special_chars=True,
        digits=True,
        upper_case=True,
        lower_case=True,
    )

    class Meta:
        model = get_user_model()
        django_get_or_create = ["email"]

UserFactory -这个不工作

create_batch(4)进程中只创建一个用户

代码语言:javascript
运行
复制
from django.contrib.auth import get_user_model
from faker import Faker
from factory.django import DjangoModelFactory

fake = Faker()

class UserFactory(DjangoModelFactory):

email = fake.email()
password = fake.password()

class Meta:
    model = get_user_model()
    django_get_or_create = ["email"]

唯一的区别是我生成用户电子邮件的方式。factory.Faker("email)工作得很好,但faker.email()没有。

也许有人也有同样的问题?

https://factoryboy.readthedocs.io/en/stable/index.html

  • faker

EN

Stack Overflow用户

发布于 2021-04-20 12:58:58

您的问题来自Python的工作方式。

当您编写以下内容时:

代码语言:javascript
运行
复制
class Foo(Bar):
  email = fake.email()
  name = fake.name()

所发生的是,或多或少:

  1. Python调用fake.email(),并接收一个值(假设是fake.email())

  1. Python调用fake.name(),并接收一个值(例如,

{"email": "jane@example.org", "name": "Johannes"}构建目标类的所有类级声明的

  1. Python

  1. --传递给type以创建类:

Foo = type( "Foo",正在创建的类的名称,它的基#列表{ "jane@example.org"," Name ":"Johannes"},#)

  1. 类现在已经定义,并可用于其余的代码.

换句话说,这些行将执行如下代码:

代码语言:javascript
运行
复制
fake = faker.Faker()
fake_email = fake.email()
fake_name = fake.name()

class UserFactory(DjangoModelFactory):
  email = fake_email
  name = fake_name
  ...

如您所见,UserFactory接收来自faker的调用的结果,它无法知道这些值是如何生成的。

这就是各种声明(factory.LazyAttributefactory.Faker等)的原因:在这里,当需要构建新实例时,我们使用一个定制方法传递特定于工厂的对象,这个方法由FactoryBoy的构建器代码调用:

代码语言:javascript
运行
复制
fake_email_maker = factory.Faker("email")
fake_name_maker = factory.Faker("name")

class UserFactory(DjangoModelFactory):
  email = fake_email_maker
  name = fake_name_maker
  ...

当您调用UserFactory()时,所发生的事情如下所示:

代码语言:javascript
运行
复制
# UserFactory()
>>> fields = {}
>>> fields["name"] = UserFactory._meta.declarations...name.evaluate(...)
>>> fields["email"] = UserFactory._meta.declarations...evaluate(...)
>>> return User.objects.create(**fields)
票数 2
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67177902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档