Remote-Server und APIs für Django-Unittests sauber verspotten

9

Ich habe ein dorniges Problem, das ich nicht in den Griff zu bekommen scheint. ich bin Derzeit schreiben Unit-Tests für ein django Custom Auth-Backend. Auf unserem System haben wir eigentlich zwei Backends: eines der eingebauten Django Backend und das benutzerdefinierte Back-End, das Anfragen an eine Java-basierte API sendet Das gibt Benutzerinformationen in Form von XML zurück. Jetzt schreibe ich Einheit Tests, damit ich keine Anfragen außerhalb des Systems senden möchte Ich versuche nicht, die Java API zu testen, also meine Frage ist, wie kann ich umgehen Sie dies und verspotten Sie die Nebenwirkungen auf die robusteste Weise.

Die Funktion, die ich gerade teste, ist so etwas wie die URL Einstellungswert ist nur die Basis-URL für den Java-Server authentifiziert den Benutzernamen und das Passwort und gibt das XML zurück, und der Servicewert ist nur ein bisschen Magie für den Aufbau der URL-Abfrage, es ist unwichtig für uns:

%Vor%

Also, wir bekommen das xml, parsen es in ein dict und wenn der key nil vorhanden ist dann können wir das dict zurückgeben und glücklich und authentisch weitermachen. Klar, eine Lösung ist nur, einen Weg zu finden, um irgendwie zu überschreiben oder Monkeypatch die Logik in der XML-Variable, fand ich diese Antwort:

Wie kann man ein Mock / Stub-Python-Modul wie urllib

Ich habe versucht, so etwas zu implementieren, aber die Details sind da sehr skizzenhaft und ich konnte nicht scheinen, dass das funktioniert.

Ich habe auch die XML-Antwort erfasst und sie in eine lokale Datei in der Testordner mit der Absicht, einen Weg zu finden, diesen als Mock zu verwenden Antwort, die an den URL-Parameter der Testfunktion übergeben wird, So etwas überschreibt die URL:

%Vor%

Aber das muss auch die Logik der URL-Erstellung berücksichtigen, die die Funktion definiert (d. h. "url + encoded_params"). Wieder könnte ich umbenennen Die Antwortdatei ist die gleiche wie die verkettete URL, dies wird jedoch immer weniger wie ein guter Unit-Test für die Funktion und eher ein "Cheat", das Ganze Mit diesen Lösungen wird das Ganze immer brüchiger und es ist sowieso nur ein Fixpunkt, den ich auch vermeiden möchte überhaupt möglich.

Ich habe mich auch gefragt, ob es eine Möglichkeit geben könnte, die XML auf dem Django-Entwicklungsserver bereitzustellen und dann die Funktion darauf zu richten? Es scheint eine vernünftige Lösung zu sein, aber viel Googeln gab mir keine Hinweise, ob so etwas möglich oder ratsam wäre und selbst dann denke ich nicht, dass dies ein Test wäre, der außerhalb der Entwicklungsumgebung laufen würde.

Also, im Idealfall muss ich irgendwie in der Lage sein, einen "Server" zu verspotten nehmen Sie die Stelle der Java-API im Funktionsaufruf oder irgendwie dienen ein paar XML-Nutzdaten, die die Funktion als ihre URL öffnen kann, oder Monkeypatch die Funktion aus dem Test selbst oder ...

Hat die Mock-Bibliothek die entsprechenden Werkzeuge, um solche Dinge zu tun?

Ссылка

Also, es gibt zwei Punkte zu dieser Frage 1) Ich möchte meine lösen besonderes Problem auf eine saubere Art und vor allem 2) was ist die besten Praktiken für das saubere Schreiben von Django-Komponententests, wenn Sie es sind abhängig von Daten, Cookies usw. für die Benutzerauthentifizierung von einer Fernbedienung API, die sich außerhalb Ihrer Domain befindet?

    
osman 03.06.2013, 12:14
quelle

2 Antworten

1

Die Scheinbibliothek sollte funktionieren, wenn sie richtig verwendet wird. Ich bevorzuge die Minimock -Bibliothek und ich habe einen kleinen Basiseinheit-Testfall geschrieben ( Minimottest ), die dabei helfen.

Wenn Sie diesen Testfall mit Django integrieren möchten, um urllib zu testen, können Sie Folgendes tun:

%Vor%

Jetzt können Sie diesen Testfall verwenden, anstatt den Django-Testfall direkt zu verwenden:

%Vor%     
Pykler 03.06.2013, 13:00
quelle
0

Hier sind die Grundlagen der Lösung, die ich für die Aufzeichnung gefunden habe. Ich habe am Ende eher die Mock-Bibliothek selbst als Mockito benutzt, aber die Idee ist dieselbe:

%Vor%     
osman 05.06.2013 11:07
quelle