factory_boy を使用して、2 つの Django モデル間の多対多の関係をテストしようとしています。factory_boy のドキュメントはこれについて議論していないようで、何が間違っているのかを理解するのに苦労しています。最初のテストを実行すると、「AttributeError: 'Pizza' object has no attribute 'topping'」というエラーが表示されます。2 番目のテストでも同様のエラーが発生します。
デバッガーでテストを実行すると、「トッピング」オブジェクトが表示されますが、そこから名前を取得する方法がわかりません。PizzaFactory の _prepare メソッドを正しく定義しましたか? 多対多の関係がある場合、あるテーブルの名前に他のテーブルからどのようにアクセスしますか?
ありがとう。
models.py:
from django.db import models
class Topping(models.Model):
name = models.CharField(max_length=50)
def __unicode__(self):
return self.name
class Pizza(models.Model):
name = models.CharField(max_length=100)
toppings = models.ManyToManyField(Topping)
def __unicode__(self):
return self.name
factory.py:
import factory
from models import Topping, Pizza
class ToppingFactory(factory.Factory):
name = 'mushrooms'
class PizzaFactory(factory.Factory):
name = 'Vegetarian'
@classmethod
def _prepare(cls, create, **kwargs):
topping = ToppingFactory()
pizza = super(PizzaFactory, cls)._prepare(create, **kwargs)
pizza.toppings.add(topping)
return pizza
tests.py
from django.test import TestCase
import factory
from app.models import Topping, Pizza
from app.factories import ToppingFactory, PizzaFactory
class FactoryTestCase(TestCase):
def test_pizza_has_mushrooms(self):
pizza = PizzaFactory()
self.assertTrue(pizza.topping.name, 'mushrooms')
def test_mushrooms_on_pizza(self):
topping = ToppingFactory()
self.assertTrue(topping.pizza.name, 'Vegetarian')