diff options
author | Raphaël Barrois <raphael.barrois@polytechnique.org> | 2016-04-07 00:09:43 +0200 |
---|---|---|
committer | Raphaël Barrois <raphael.barrois@polytechnique.org> | 2016-04-07 00:09:43 +0200 |
commit | 872718c1eb7865878ff17c8ce7dbeb004a089e40 (patch) | |
tree | 2b00752cbaa7dd7ce457f29354c2e7b728701ae9 | |
parent | 94a9b2cf9ddd7be181c984793a5404e2b95a779e (diff) | |
parent | 5836329889ac45034978c69b6a6f7de4b0b5b75d (diff) | |
download | factory-boy-872718c1eb7865878ff17c8ce7dbeb004a089e40.tar factory-boy-872718c1eb7865878ff17c8ce7dbeb004a089e40.tar.gz |
Merge pull request #285 from sampaccoud/feature/add-documentation-and-test-about-factory-parent-attribute
Add documentation and test for subfactory using "factory_parent" attribute
-rw-r--r-- | docs/recipes.rst | 14 | ||||
-rw-r--r-- | tests/test_using.py | 20 |
2 files changed, 34 insertions, 0 deletions
diff --git a/docs/recipes.rst b/docs/recipes.rst index a3df7be..fe18f50 100644 --- a/docs/recipes.rst +++ b/docs/recipes.rst @@ -327,7 +327,21 @@ Here, we want: country = factory.SubFactory(CountryFactory) owner = factory.SubFactory(UserFactory, country=factory.SelfAttribute('..country')) +If the value of a field on the child factory is indirectly derived from a field on the parent factory, you will need to use LazyAttribute and poke the "factory_parent" attribute. +This time, we want the company owner to live in a country neighboring the country of the company: + +.. code-block:: python + + class CompanyFactory(factory.django.DjangoModelFactory): + class Meta: + model = models.Company + + name = "ACME, Inc." + country = factory.SubFactory(CountryFactory) + owner = factory.SubFactory(UserFactory, + country=factory.LazyAttribute(lambda o: get_random_neighbor(o.factory_parent.country))) + Custom manager methods ---------------------- diff --git a/tests/test_using.py b/tests/test_using.py index eaeb8da..0ce29e9 100644 --- a/tests/test_using.py +++ b/tests/test_using.py @@ -1268,6 +1268,26 @@ class SubFactoryTestCase(unittest.TestCase): self.assertEqual('x0x', test_model.two.one) self.assertEqual('x0xx0x', test_model.two.two) + def test_sub_factory_with_lazy_fields_access_factory_parent(self): + class TestModel2(FakeModel): + pass + + class TestModelFactory(FakeModelFactory): + class Meta: + model = TestModel + one = 3 + + class TestModel2Factory(FakeModelFactory): + class Meta: + model = TestModel2 + one = 'parent' + child = factory.SubFactory(TestModelFactory, + one=factory.LazyAttribute(lambda o: '%s child' % o.factory_parent.one), + ) + + test_model = TestModel2Factory() + self.assertEqual('parent child', test_model.child.one) + def test_sub_factory_and_sequence(self): class TestObject(object): def __init__(self, **kwargs): |