I am trying to test the many-to-many relationship between two Django models using factory_boy. The factory_boy documentation doesn't seem to discuss this, and it's hard for me to understand what I'm doing wrong. When I run the first test, I get the error "AttributeError: object" Pizza "does not have the attribute" topping "". I get a similar error for the second test.
When I run tests in the debugger, I can see the "toppings" object, but it does not understand how to get a name from it. Did I define the PizzaFactory _prepare method correctly? How to access a name in one table from another table when you have a many-to-many relationship?
Thanks.
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
factories.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')
unit-testing django-testing factory-boy
William
source share