2013-07-09 16 views
10

Ich benutze Factory Boy, um Testfabriken für meine Django-App zu erstellen. Das Modell, das ich mit einem Problem habe ist ein sehr einfaches Konto-Modell, das einen OneToOne Bezug auf das django Benutzer-Auth-Modell hat (mit django < 1.5):Django Fabrik Junge Fabrik mit OneToOne Beziehung und verwandtes Feld

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

Hier meine Fabriken sind:

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

erwarten Also ich bin der Fabrik Junge, der einen Zusammenhang Userfactory zu erstellen, wenn AccountFactory aufgerufen wird:

# 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 

Wenn jedoch der Test ausgeführt wird, sieht es aus wie mehrere Benutzer Modelle werden erstellen, und ich einen integriy Fehler sehe:

IntegrityError: column username is not unique 

Die Dokumentation für Schleifen Ausschau nicht erwähnt, wenn sie mit Kreis Importen zu tun, aber ich bin nicht sicher, ob das ist, was los ist, noch, wie ich Abhilfe schaffen. docs

Wenn jemand, der mit Factory Boy vertraut ist, einläuten könnte oder einen Einblick geben könnte, was diesen Integritätsfehler verursachen könnte, würde er sehr geschätzt werden!

+0

FYI, passiert der Fehler, auch wenn kein 'post_save' Signal ist. – alecxe

+0

Ihr Recht, ich habe die Codebeispiele entsprechend bearbeitet – darko

Antwort

10

Ich glaube, das liegt daran, dass Sie eine zirkuläre Referenz in Ihrer Fabrik Definitionen haben. Versuchen Sie, die Zeile account = factory.RelatedFactory(AccountFactory) aus der UserFactory Definition zu entfernen. Wenn Sie die Account-Erstellung immer über AccountFactory aufrufen, sollten Sie diese Zeile nicht benötigen.

Sie können auch eine Sequenz in das Namensfeld einfügen, sodass Sie diese automatisch generieren können, wenn Sie mehr als einen Account benötigen.

Wechsel: username = "bob" zu username = factory.Sequence(lambda n : "bob {}".format(n)) und Ihre Benutzer "bob 1", "bob 2" genannt werden, usw.

+0

Siehe auch: http://factoryboy.readthedocs.org/en/latest/reference.html#circular-imports. Sie haben zwei SubFactory in den Dokumenten anstelle einer RelatedFactory und einer SubFactory. Vielleicht verursacht das ein Problem? – hgcrpd