Test Django Aussicht, dass eine Anmeldung erforderlich ist mit RequestFactory
Ich bin neu in Django und ich möchte die unit-test-eine Ansicht, die erfordert, dass der Benutzer angemeldet sein (@login_requred
). Django freundlicherweise bietet die RequestFactory
, die ich theoretisch verwenden Sie zum aufrufen der Ansicht direkt:
factory = RequestFactory()
request = factory.get("/my/home/url")
response = views.home(request)
Jedoch, schlägt der Aufruf fehl mit
AttributeError: 'WSGIRequest' object has no attribute 'session'
Offenbar das ist gewollt, aber wo sieht das denn aus? Wie kann ich testen, Ansichten, die eine Authentifizierung erfordern (was in meinem Fall alle von Ihnen)? Oder bin ich der falsche Ansatz?
Bin ich mit Django 1.3 und Python 2.7.
- Ich denke, Django-Test-Client docs.djangoproject.com/en/dev/topics/testing, sollte sein, was du bist suchen für.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn mit RequestFactory, die Sie testen anzeigen mit genau bekannten Eingänge.
Dass ermöglicht die Isolation von tests über die Auswirkungen der zusätzlichen Verarbeitung von verschiedenen middleware-Komponenten installiert und damit genauer testen.
Können Sie die setup-Anfrage mit zusätzlichen Daten, die view-Funktion erwarten, D. H.:
Meine persönliche Empfehlung ist die Verwendung TestClient zu tun, integration Tests (sprich: die gesamte Benutzer-checkout-Prozess im shop umfasst viele Schritte) und RequestFactory zu testen unabhängige view-Funktionen Verhalten und die Ausgabe (dh. hinzufügen Produkts zum Warenkorb).
Django 1.11
Als @bmihelac erwähnt, RequestFactory nur Tests bekannt Eingänge (was bedeutet, dass keine middleware ist im Lieferumfang enthalten). Für details über die Argumentation, Lesen hier. Die akzeptierte Lösung ist ideal, wenn Sie möchten, eine leere session (und ich Stimme mit @dm03514, der Client sollte verwendet werden, für die integration-Tests).
Jedoch, wenn Sie weiterhin verwenden möchten, Django ' s SessionMiddleware (oder Middleware), können Sie etwas tun, wie dies in tests (Beispiel unten ist für den Test einer Klasse-Based View):