2013-07-09 24 views
10

Tôi đang sử dụng Factory Boy để tạo các nhà máy thử nghiệm cho ứng dụng django của tôi. Các mô hình tôi đang gặp một vấn đề với là một mô hình tài khoản rất cơ bản trong đó có một mối quan hệ OneToOne với mô hình auth django tài khoản (sử dụng django < 1.5):Nhà máy django factory boy với quan hệ OneToOne và lĩnh vực liên quan

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

Dưới đây là các nhà máy của tôi:

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

Vì vậy, tôi hy vọng cậu bé nhà máy để tạo ra một UserFactory liên quan bất cứ khi nào AccountFactory được gọi:

# 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 

Khi chạy thử nghiệm tuy nhiên, có vẻ như nhiều tài khoản mô hình đang được tạo ra, và tôi nhìn thấy một lỗi integriy:

IntegrityError: column username is not unique 

Các tài liệu nào đề cập đến xem ra cho các vòng lặp khi giao dịch với hàng nhập khẩu tròn, nhưng tôi không chắc chắn cho dù đó là whats going on, cũng không phải làm thế nào tôi sẽ khắc phục nó. docs

Nếu ai đó quen thuộc với Factory Boy có thể kêu gọi hoặc cung cấp một số thông tin chi tiết về những gì có thể gây ra lỗi toàn vẹn này, nó sẽ được đánh giá cao!

+0

FYI, lỗi xảy ra ngay cả khi không có tín hiệu 'post_save'. – alecxe

+0

Quyền của bạn, tôi đã chỉnh sửa các ví dụ mã tương ứng – darko

Trả lời

10

Tôi tin rằng điều này là do bạn có tham chiếu vòng tròn trong định nghĩa nhà máy của mình. Thử xóa dòng account = factory.RelatedFactory(AccountFactory) khỏi định nghĩa UserFactory. Nếu bạn luôn muốn gọi tạo tài khoản thông qua AccountFactory, thì bạn không nên cần dòng này.

Ngoài ra, bạn có thể xem xét việc đính kèm một chuỗi vào trường tên, để nếu bạn cần nhiều hơn một tài khoản, nó sẽ tự động tạo chúng.

Thay đổi: username = "bob" để username = factory.Sequence(lambda n : "bob {}".format(n)) và người dùng của bạn sẽ được đặt tên "bob 1", "bob 2", vv

+0

Ngoài ra, hãy xem: http://factoryboy.readthedocs.org/en/latest/reference.html#circular-imports. Họ có hai SubFactory trong các tài liệu, thay vì một RelatedFactory và SubFactory. Có thể điều đó gây ra vấn đề? – hgcrpd