python / intermediate
Snippet
Context Manager to Mute Django Signals During Unit Testing
Creating a context manager using @contextmanager helps temporarily disconnect model signals in unit tests to prevent unintended side effects like sending emails.
snippet.py
python
1
2
3
4
5
6
7
8
9
10
from contextlib import contextmanagerfrom django.db.models.signals import post_save@contextmanagerdef mute_signal(signal, receiver, sender):signal.disconnect(receiver, sender=sender)try:yieldfinally:signal.connect(receiver, sender=sender)
django
Breakdown
1
@contextmanager
Decorator from contextlib converting a generator into a Python context manager.
2
signal.disconnect(receiver, sender=sender)
Temporarily unbinds the signal handler before entering the context block.
3
signal.connect(receiver, sender=sender)
Re-attaches the signal handler in the finally block when leaving the context.