django工厂男孩工厂与OneToOne的关系及相关领域

dar*_*rko 13 python testing django factory-boy

我正在使用Factory Boy为我的django应用程序创建测试工厂.我遇到问题的模型是一个非常基本的Account模型,它与django User auth模型有一个OneToOne关系(使用django <1.5):

# models.py
from django.contrib.auth.models import User
from django.db import models

class Account(models.Model):
    user = models.OneToOneField(User)
    currency = models.CharField(max_length=3, default='USD')
    balance = models.CharField(max_length="5", default='0.00') 
Run Code Online (Sandbox Code Playgroud)

这是我的工厂:

# factories.py
from django.db.models.signals import post_save
from django.contrib.auth.models import User

import factory

from models import Account


class AccountFactory(factory.django.DjangoModelFactory):
    FACTORY_FOR = Account

    user = factory.SubFactory('app.factories.UserFactory')
    currency             = 'USD'
    balance              = '50.00'

class UserFactory(factory.django.DjangoModelFactory):
    FACTORY_FOR = User

    username = 'bob'
    account = factory.RelatedFactory(AccountFactory)
Run Code Online (Sandbox Code Playgroud)

因此,每当调用AccountFactory时,我都希望工厂男孩能够创建一个相关的UserFactory:

# tests.py 
from django.test import TestCase

from factories import AccountFactory

class AccountTest(TestCase):

    def setUp(self):
        self.factory = AccountFactory()

    def test_factory_boy(self):
        print self.factory.id
Run Code Online (Sandbox Code Playgroud)

然而,在运行测试时,看起来正在创建多个用户模型,并且我看到了整合错误:

IntegrityError: column username is not unique
Run Code Online (Sandbox Code Playgroud)

文档确实提到了在处理循环导入时注意循环,但我不确定这是否正在进行,我不知道如何补救它.文档

如果熟悉Factory Boy的任何人可以插入或提供有关可能导致此完整性错误的一些信息,那将非常感谢!

hgc*_*rpd 11

我相信这是因为您的工厂定义中有循环引用.尝试account = factory.RelatedFactory(AccountFactory)UserFactory定义中删除该行.如果您总是通过AccountFactory调用帐户创建,那么您不应该需要此行.

此外,您可以考虑将序列附加到名称字段,这样,如果您确实需要多个帐户,它将自动生成它们.

更改:username = "bob"username = factory.Sequence(lambda n : "bob {}".format(n)),您的用户将被命名为"bob 1","bob 2"等.