私はオープン ソースの django Web アプリに取り組んでおり、Factory Boy を使用していくつかのテスト用のモデルをセットアップすることを検討していますが、数時間ドキュメントを読んで例を見た後、敗北を受け入れる必要があると思いますとここで質問。
次のような Customer モデルがあります。
class Customer(models.Model):
def save(self, *args, **kwargs):
if not self.full_name:
raise ValidationError('The full_name field is required')
super(Customer, self).save(*args, **kwargs)
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.SET_NULL,
related_name='customer',
null=True
)
created = models.DateTimeField()
created_in_billing_week = models.CharField(max_length=9)
full_name = models.CharField(max_length=255)
nickname = models.CharField(max_length=30)
mobile = models.CharField(max_length=30, default='', blank=True)
gocardless_current_mandate = models.OneToOneField(
BillingGoCardlessMandate,
on_delete=models.SET_NULL,
related_name='in_use_for_customer',
null=True,
)
また、django.contrib.auth の標準の Django ユーザー モデルも使用しています。
これが私の工場コードです:
class UserFactory(DjangoModelFactory):
class Meta:
model = get_user_model()
class CustomerFactory(DjangoModelFactory):
class Meta:
model = models.Customer
full_name = fake.name()
nickname = factory.LazyAttribute(lambda obj: obj.full_name.split(' ')[0])
created = factory.LazyFunction(timezone.now)
created_in_billing_week = factory.LazyAttribute(lambda obj: str(get_billing_week(obj.created)))
mobile = fake.phone_number()
user = factory.SubFactory(UserFactory, username=nickname,
email="{}@example.com".format(nickname))
私の場合、そのような顧客を生成できるようにしたい
CustomerFactory(fullname="Joe Bloggs")
そして、正しいユーザー名と電子メール アドレスを使用して、対応するユーザーを生成します。
現在、次のエラーが発生しています。
AttributeError: The parameter full_name is unknown. Evaluated attributes are {'email': '<factory.declarations.LazyAttribute object at 0x111d999e8>@example.com'}, definitions are {'email': '<factory.declarations.LazyAttribute object at 0x111d999e8>@example.com', 'username': <DeclarationWrapper for <factory.declarations.LazyAttribute object at 0x111d999e8>>}.
これは、ユーザー ファクトリが作成される前に呼び出されない顧客の遅延属性に依存しているためだと思います。
上記のように、ファクトリを使用して Customer モデル インスタンスを作成し、対応するユーザーを作成できるようにするには、どうすればよいですか?
それだけの価値があるため、完全なモデルはgithub リポジトリでここに表示されます