2013-07-09 15 views
10

Używam Factory Boy do tworzenia fabryk testowych dla mojej aplikacji django. Model Mam problem z to bardzo podstawowy model Account, który ma związek OneToOne do modelu auth Django użytkownika (przy użyciu Django < 1.5):Fabryka fabryki django dla chłopców ze związkiem OneToOne i dziedziną pokrewną

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

Oto moje fabryki:

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

Więc spodziewam chłopca fabryki stworzyć związane UserFactory ilekroć AccountFactory jest wywoływana:

# 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 

Po uruchomieniu testu jednak wygląda na to, stwardnienie użytkownika Modele są jako stworzenia, a ja widząc integriy błąd:

IntegrityError: column username is not unique 

Dokumentacja wspomina uważając na pętli przy zajmujących się przywozem okrągłymi, ale nie jestem pewien, czy to, co się dzieje, ani jak bym napraw to. docs

Jeśli ktoś znający Factory Boy mógłby zadzwonić lub podać wgląd w to, co może być przyczyną tego błędu integralności, byłby bardzo ceniony!

+0

FYI, błąd zdarza się nawet, jeśli nie ma 'sygnał post_save'. – alecxe

+0

Twoje prawo, ja edytowałem przykłady kodu odpowiednio – darko

Odpowiedz

10

Uważam, że dzieje się tak dlatego, że w definicjach fabrycznych istnieje okólnik. Spróbuj usunąć linię account = factory.RelatedFactory(AccountFactory) z definicji . Jeśli zawsze powołujesz się na utworzenie konta za pośrednictwem usługi AccountFactory, nie powinieneś potrzebować tej linii.

Możesz również rozważyć dołączenie sekwencji do pola nazwy, więc jeśli będziesz potrzebować więcej niż jednego konta, wygeneruje je automatycznie.

Zmiana: username = "bob" do username = factory.Sequence(lambda n : "bob {}".format(n)) a użytkownicy zostaną o nazwie "bob 1", "bob 2" itd

+0

Zobacz także: http://factoryboy.readthedocs.org/en/latest/reference.html#circular-imports. Mają dwa SubFactory w dokumentach, zamiast RelatedFactory i SubFactory. Może to powoduje problem? – hgcrpd