FactoryBoy & ManyToManyField

318 views
Skip to first unread message

Craig Blaszczyk

unread,
Nov 20, 2012, 12:36:16 PM11/20/12
to django...@googlegroups.com
Hi Guys,

I'm using FactoryBoy in my tests, but I have a model which has a ManyToManyField to another model. Does anyone know if it's possible to make factoryboy use a factory to represent this relationship?

For reference, here are a sample model and factory:

--models.py
from django.contrib.auth.models import User
from django.db.models import ManyToManyField
class Workplace(models.Model):
    employees = ManyToManyField(User)

--tests.py
import factory
from models import Workplace

# This will set the default strategy for all factories that don't define a default build strategy
factory.Factory.default_strategy = factory.BUILD_STRATEGY

class WorkplaceFactory(factory.Factory):
    FACTORY_FOR = Workplace


class UserFactory(factory.Factory):
    FACTORY_FOR = User


class ATestCase(TestCase):

    def setUp(self):
        super(ATestCase, self).setUp()
        self.user = UserFactory.build()
        self.workplace = WorkplaceFactory.build()

    def test_foobar(self):
        # how do I add self.user to self.workplace ?
        self.assertEqual(self.workplace.employees_set.all(), 1)



--Craig

Andres Reyes Monge

unread,
Nov 20, 2012, 6:01:23 PM11/20/12
to django...@googlegroups.com
The simplest would be to 

class ATestCase(TestCase):

    def setUp(self):
        super(ATestCase, self).setUp()
        self.user = UserFactory()
        self.workplace = WorkplaceFactory()
        self.workplace.employees_set.add(self.user)

    def test_foobar(self):
        # how do I add self.user to self.workplace ?
        self.assertEqual(self.workplace.employees_set.all(), 1)


Note that you probably want to use create instead of build so that the objects are saved to the database
Reply all
Reply to author
Forward
0 new messages