python / expert
Snippet
Benutzerdefinierter Test-Antwort-Kontext-Extraktor über dynamische Funktions-Dekoratoren
Beim Schreiben fortgeschrittener Testreihen in Django können Funktions-Dekoratoren höherer Ordnung Testmethoden umschließen, um von Client-Aufrufen zurückgegebene `HttpResponse`-Objekte abzufangen. Dieses Muster erzwingt standardmäßige Kontext-Validierungen über Testfälle hinweg ohne Code-Duplizierung.
snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from functools import wrapsfrom django.test import TestCasedef assert_context_key(key_name, expected_type):def decorator(func):@wraps(func)def wrapper(self: TestCase, *args, **kwargs):response = func(self, *args, **kwargs)val = response.context.get(key_name)self.assertIsNotNone(val, f"Key {key_name} missing in response context")self.assertIsInstance(val, expected_type)return responsereturn wrapperreturn decorator
django
Erklärung
1
from functools import wraps
Importiert wraps, um den ursprünglichen Testfunktionsnamen, Docstring und Annotationen zu bewahren.
2
def assert_context_key(key_name, expected_type):
Defiert eine parametrisierte Dekorator-Fabrik, die den erwarteten Kontext-Schlüsselnamen und Typ akzeptiert.
3
def decorator(func):
Definiert die äußere Closure, die die ursprüngliche Testfunktion empfängt.
4
def wrapper(self: TestCase, *args, **kwargs):
Definiert den inneren Ausführungs-Wrapper, der die TestCase self-Instanz und Aufrufargumente empfängt.
5
response = func(self, *args, **kwargs)
Führt die dekorierte Testmethode aus, um das Django-Testantwort-Objekt zu erhalten.
6
val = response.context.get(key_name)
Extrahiert den mit key_name verknüpften Wert aus dem Template-Kontext-Wörterbuch.
7
self.assertIsNotNone(val, f"Key {key_name} missing in response context")
Überprüft die Existenz der Kontextvariablen mit TestCase-Instanzmethoden.
8
self.assertIsInstance(val, expected_type)
Validiert den Datentyp der extrahierten Kontextvariablen.