diff options
author | Raphaël Barrois <raphael.barrois@polytechnique.org> | 2015-05-24 18:21:04 +0200 |
---|---|---|
committer | Raphaël Barrois <raphael.barrois@polytechnique.org> | 2015-05-24 18:21:04 +0200 |
commit | ebc89520d3f7589da35d4e7b78637fbe7d4d664a (patch) | |
tree | 99f2d3a171444ffcf2150b89bf2355a1f70036ff /tests | |
parent | 6f37f9be2d2e1bc75340068911db18b2bbcbe722 (diff) | |
download | factory-boy-ebc89520d3f7589da35d4e7b78637fbe7d4d664a.tar factory-boy-ebc89520d3f7589da35d4e7b78637fbe7d4d664a.tar.gz |
Add lazy loading to factory.Iterator.
factory.Iterator no longers begins iteration of its argument
on declaration, since this behavior may trigger database query
when that argument is, for instance, a Django queryset.
The ``factory.Iterator``'s argument will only be called when
the containing ``Factory`` is first evaluated; this means that
factories using ``factory.Iterator(models.MyThingy.objects.all())``
will no longer call the database at import time.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test_django.py | 2 | ||||
-rw-r--r-- | tests/test_using.py | 32 |
2 files changed, 33 insertions, 1 deletions
diff --git a/tests/test_django.py b/tests/test_django.py index 2cfb55c..bde8efe 100644 --- a/tests/test_django.py +++ b/tests/test_django.py @@ -21,6 +21,7 @@ """Tests for factory_boy/Django interactions.""" import os +from .compat import is_python2, unittest, mock try: @@ -64,7 +65,6 @@ except ImportError: # pragma: no cover import factory import factory.django -from .compat import is_python2, unittest, mock from . import testdata from . import tools diff --git a/tests/test_using.py b/tests/test_using.py index 6d75531..c7d2b85 100644 --- a/tests/test_using.py +++ b/tests/test_using.py @@ -1493,6 +1493,38 @@ class IteratorTestCase(unittest.TestCase): for i, obj in enumerate(objs): self.assertEqual(i + 10, obj.one) + def test_iterator_late_loading(self): + """Ensure that Iterator doesn't unroll on class creation. + + This allows, for Django objects, to call: + foo = factory.Iterator(models.MyThingy.objects.all()) + """ + class DBRequest(object): + def __init__(self): + self.ready = False + + def __iter__(self): + if not self.ready: + raise ValueError("Not ready!!") + return iter([1, 2, 3]) + + # calling __iter__() should crash + req1 = DBRequest() + with self.assertRaises(ValueError): + iter(req1) + + req2 = DBRequest() + + class TestObjectFactory(factory.Factory): + class Meta: + model = TestObject + + one = factory.Iterator(req2) + + req2.ready = True + obj = TestObjectFactory() + self.assertEqual(1, obj.one) + class BetterFakeModelManager(object): def __init__(self, keys, instance): |