python / expert
Snippet
Transaktionsgrenzen-Mocking in Integrationstests
Das Einpacken von Djangos transaction.on_commit-Hooks mit Test-Dekoratoren erzwingt die synchrone Ausführung von Post-Commit-Callbacks unter Anwendung von Mocks in Integrationstests.
snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import functoolsfrom unittest.mock import patchfrom django.db import transactiondef mock_external_call_on_commit(mock_target: str):def decorator(func):@functools.wraps(func)def wrapper(*args, **kwargs):def patched_on_commit(callback, using=None):with patch(mock_target) as mock_obj:callback()with patch.object(transaction, 'on_commit', side_effect=patched_on_commit):return func(*args, **kwargs)return wrapperreturn decorator
django
Erklärung
1
def mock_external_call_on_commit(mock_target: str):
Parametrisierter Test-Dekorator, der den Pfad der zu mockenden Ziel-Funktion entgegennimmt.
2
def patched_on_commit(callback, using=None):
Ersetzt transaction.on_commit, um den Callback sofort auszuführen.
3
with patch(mock_target) as mock_obj:
Wendet den Unittest-Mock innerhalb des Ausführungskontexts des Commit-Callbacks an.
4
with patch.object(transaction, 'on_commit', side_effect=patched_on_commit):
Ersetzt Djangos on_commit-Handler auf Modulebene für die Dauer der Testausführung.