好的,我的测试文件遇到了有趣的问题。
我使用这个简单的代码来检查UserFactory
创建的用户
UserFactory.create_batch(4)
for u in User.objects.all():
print(u.email)
UserFactory -这是很好的
在create_batch(4)
进程中创建4个用户
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)
进程中只创建一个用户
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
发布于 2021-04-20 12:58:58
您的问题来自Python的工作方式。
当您编写以下内容时:
class Foo(Bar):
email = fake.email()
name = fake.name()
所发生的是,或多或少:
fake.email()
,并接收一个值(假设是fake.email()
)fake.name()
,并接收一个值(例如,{"email": "jane@example.org", "name": "Johannes"}
构建目标类的所有类级声明的
type
以创建类:Foo = type( "Foo",正在创建的类的名称,它的基#列表{ "jane@example.org"," Name ":"Johannes"},#)
换句话说,这些行将执行如下代码:
fake = faker.Faker()
fake_email = fake.email()
fake_name = fake.name()
class UserFactory(DjangoModelFactory):
email = fake_email
name = fake_name
...
如您所见,UserFactory
接收来自faker的调用的结果,它无法知道这些值是如何生成的。
这就是各种声明(factory.LazyAttribute
、factory.Faker
等)的原因:在这里,当需要构建新实例时,我们使用一个定制方法传递特定于工厂的对象,这个方法由FactoryBoy的构建器代码调用:
fake_email_maker = factory.Faker("email")
fake_name_maker = factory.Faker("name")
class UserFactory(DjangoModelFactory):
email = fake_email_maker
name = fake_name_maker
...
当您调用UserFactory()
时,所发生的事情如下所示:
# UserFactory()
>>> fields = {}
>>> fields["name"] = UserFactory._meta.declarations...name.evaluate(...)
>>> fields["email"] = UserFactory._meta.declarations...evaluate(...)
>>> return User.objects.create(**fields)
https://stackoverflow.com/questions/67177902
复制相似问题