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(...))
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With