2013-07-09 73 views
10

我使用Factory Boy爲我的Django應用程序創建測試工廠。我有一個問題,該模型是一個非常基本的Account模型具有OneToOne關係到Django的用戶驗證模型(使用Django < 1.5):Django工廠男孩工廠與OneToOne的關係和相關領域

# 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') 

這裏是我的工廠:

# 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) 

所以我期待在工廠的男孩創建相關UserFactory每當AccountFactory被調用:

# 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 

然而,當運行測試,它看起來像多用戶模型正在創建和我看到的integriy錯誤:

IntegrityError: column username is not unique 

的文件確實提到密切關注着圓形進口打交道時的循環,但我不知道這是否是怎麼回事,也不是我會怎樣補救它。 docs

如果任何熟悉Factory Boy的人都可以參與或提供一些有關可能導致此完整性錯誤的信息,那將非常感謝!

+0

僅供參考,錯誤發生,即使沒有'post_save'信號。 – alecxe

+0

您的權利,我已編輯相應的代碼示例 – darko

回答

10

我相信這是因爲您在工廠定義中有循環引用。嘗試從UserFactory定義中刪除account = factory.RelatedFactory(AccountFactory)行。如果您總是通過AccountFactory調用帳戶創建,那麼您不應該需要這一行。另外,您可能會考慮將序列附加到名稱字段,以便如果您確實需要多個帳戶,它會自動生成它們。

變化:username = "bob"username = factory.Sequence(lambda n : "bob {}".format(n))和您的用戶將被命名爲「鮑勃·1」,「鮑勃·2」等

+0

另請參閱:http://factoryboy.readthedocs.org/en/latest/reference.html#circular-imports。他們在文檔中有兩個SubFactory,而不是一個RelatedFactory和一個SubFactory。也許這是造成問題? – hgcrpd