aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/changelog.rst1
-rw-r--r--factory/django.py2
-rw-r--r--tests/test_django.py13
3 files changed, 16 insertions, 0 deletions
diff --git a/docs/changelog.rst b/docs/changelog.rst
index eea38c5..01d5775 100644
--- a/docs/changelog.rst
+++ b/docs/changelog.rst
@@ -20,6 +20,7 @@ ChangeLog
*Bugfix:*
- :issue:`201`: Properly handle custom Django managers when dealing with abstract Django models.
+ - :issue:`212`: Fix :meth:`factory.django.mute_signals` to handle Django's signal caching
.. _v2.5.2:
diff --git a/factory/django.py b/factory/django.py
index e4a3ea7..5cc2b31 100644
--- a/factory/django.py
+++ b/factory/django.py
@@ -277,6 +277,8 @@ class mute_signals(object):
receivers)
signal.receivers = receivers
+ with signal.lock:
+ signal.sender_receivers_cache.clear()
self.paused = {}
def copy(self):
diff --git a/tests/test_django.py b/tests/test_django.py
index b8e7ccb..103df91 100644
--- a/tests/test_django.py
+++ b/tests/test_django.py
@@ -678,6 +678,19 @@ class PreventSignalsTestCase(unittest.TestCase):
self.assertSignalsReactivated()
+ def test_signal_cache(self):
+ with factory.django.mute_signals(signals.pre_save, signals.post_save):
+ signals.post_save.connect(self.handlers.mute_block_receiver)
+ WithSignalsFactory()
+
+ self.assertTrue(self.handlers.mute_block_receiver.call_count, 1)
+ self.assertEqual(self.handlers.pre_init.call_count, 1)
+ self.assertFalse(self.handlers.pre_save.called)
+ self.assertFalse(self.handlers.post_save.called)
+
+ self.assertSignalsReactivated()
+ self.assertTrue(self.handlers.mute_block_receiver.call_count, 1)
+
def test_class_decorator(self):
@factory.django.mute_signals(signals.pre_save, signals.post_save)
class WithSignalsDecoratedFactory(factory.django.DjangoModelFactory):