Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can you create a factory-boy subfactory that only creates instances if the user requests it at call time?

I would like to create a subfactory that only creates instances if the user requests it at call time.

Given these models:

class Group(models.Model):
    name = models.CharField()

class Member(models.Model):
    name = models.CharField()
    group = models.ForeigKey(Group, blank=True, null=True)

And this factory:

class MemberFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Member

    name = factory.Sequence("Member {}".format)
    group = factory.Subfactory(GroupFactory)

I would like the option of only creating a group if explicitly requested, but without losing all other features. In other words these should all work:

MemberFactory()  # Expect group=None
MemberFactory(group=True)  # Expect group=GroupFactory()
MemberFactory(group__name="ABC")
MemberFactory(group=Group.objects.get(...))
like image 667
jerivas Avatar asked Nov 15 '25 09:11

jerivas


1 Answers

As pointed out in comments, you can create MemberFactory with group = None. This will generate a member without group. You can also generate a member with a group you specify inside of a MemberFactory call.

# factories.py
import factory

from ..models import Member, Group


class GroupFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Group


class MemberFactory(factory.django.DjangoModelFactory):
    name = factory.Sequence("Member {}".format)
    group = None

    class Meta:
        model = Member

# test_factory.py
from django.test import TestCase

from . import factories


class FactoryTestCase(TestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        cls.member_without_group = factories.MemberFactory()
        cls.member_with_group = factories.MemberFactory(
            group=factories.GroupFactory()
        )

    def test_member_without_group(self):
        self.assertIsNone(self.member_without_group.group)

    def test_member_with_group(self):
        self.assertIsNotNone(self.member_with_group.group)

like image 111
SukiCZ Avatar answered Nov 17 '25 21:11

SukiCZ



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!