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!
FYI, lỗi xảy ra ngay cả khi không có tín hiệu 'post_save'. – alecxe
Quyền của bạn, tôi đã chỉnh sửa các ví dụ mã tương ứng – darko