Ich versuche, das Pythons-Mock-Paket zu verwenden, um das Pythons- requests
Modul zu verspotten . Was sind die grundlegenden Anforderungen, um mich im folgenden Szenario zum Arbeiten zu bringen?
In meiner views.py habe ich eine Funktion, die verschiedene Anfragen von request.get () mit jeweils unterschiedlicher Antwort ausführt
def myview(request):
res1 = requests.get('aurl')
res2 = request.get('burl')
res3 = request.get('curl')
In meiner Testklasse möchte ich so etwas machen, kann aber keine genauen Methodenaufrufe herausfinden
Schritt 1:
# Mock the requests module
# when mockedRequests.get('aurl') is called then return 'a response'
# when mockedRequests.get('burl') is called then return 'b response'
# when mockedRequests.get('curl') is called then return 'c response'
Schritt 2:
Rufen Sie meine Ansicht
Schritt 3:
Antwort überprüfen enthält 'a Antwort', 'b Antwort', 'c Antwort'
Wie kann ich Schritt 1 abschließen (Verspotten des Anforderungsmoduls)?
Antworten:
So können Sie es machen (Sie können diese Datei so wie sie ist ausführen):
Wichtiger Hinweis: Wenn Ihre
MyGreatClass
Klasse beispielsweise in einem anderen Paket lebtmy.great.package
, müssen Sie sich verspotten,my.great.package.requests.get
anstatt nur 'request.get'. In diesem Fall würde Ihr Testfall folgendermaßen aussehen:Genießen!
quelle
from unittest import mock
mitimport mock
und der Rest funktioniert wie. Sie müssen dasmock
Paket separat installieren .mock_requests_get
Bedarf eine geringfügige Änderung in Python 3 vornehmen ,yield
anstattreturn
die Iteratoren in Python 3 zurückzugeben.Versuchen Sie es mit der Antwortbibliothek :
bietet eine nette Bequemlichkeit gegenüber dem Einrichten aller Verspottungen
Es gibt auch HTTPretty :
Es ist nicht
requests
bibliotheksspezifisch, in mancher Hinsicht leistungsfähiger, obwohl ich festgestellt habe, dass es sich nicht so gut dazu eignet, die von ihm abgefangenen Anforderungen zu überprüfen, wasresponses
recht einfach istEs gibt auch httmock .
quelle
responses
, eine Platzhalter-URL abzugleichen. Das heißt, Sie implementieren eine Rückruflogik wie "Nehmen Sie den letzten Teil der URL, schlagen Sie ihn in einer Karte nach und geben Sie den entsprechenden Wert zurück". Ist das möglich und ich vermisse es einfach?request
Argument zugreifen) empfangen von der Rückruffunktion)Folgendes hat bei mir funktioniert:
quelle
from unittest import mock
. docs.python.org/3/library/unittest.mock.htmlIch habe Requests-Mock verwendet, um Tests für ein separates Modul zu schreiben:
Und die Tests:
quelle
Auf diese Weise verspotten Sie request.post und ändern es in Ihre http-Methode
quelle
mockresponse.json = lambda: {'key': 'value'}
mockresponse.json.return_value = {"key": "value"}
Wenn Sie eine gefälschte Antwort verspotten möchten, können Sie auch einfach eine Instanz der Basisklasse HttpResponse instanziieren:
quelle
HttpResponse
, anstatt ... Base, hat den Trick für mich gemacht. Vielen Dank!Eine Möglichkeit, Anfragen zu umgehen, ist die Verwendung der Bibliothek betamax. Sie zeichnet alle Anfragen auf. Wenn Sie danach eine Anfrage in derselben URL mit denselben Parametern stellen, verwendet der betamax die aufgezeichnete Anfrage. Ich habe sie zum Testen des Webcrawlers verwendet und es spart mir viel Zeit.
https://betamax.readthedocs.io/en/latest/
quelle
Nur ein hilfreicher Hinweis für diejenigen, die immer noch Probleme haben, von urllib oder urllib2 / urllib3 zu Anfragen konvertieren UND versuchen, eine Antwort zu verspotten. Bei der Implementierung meines Versuchs wurde ein etwas verwirrender Fehler angezeigt:
with requests.get(path, auth=HTTPBasicAuth('user', 'pass'), verify=False) as url:
Wenn ich etwas darüber wüsste, wie es
with
funktioniert (ich habe es nicht getan), würde ich natürlich wissen, dass es sich um einen unnötigen Kontext handelt (aus PEP 343 ). Unnötig, wenn Sie die Anforderungsbibliothek verwenden, da sie unter der Haube im Grunde das Gleiche für Sie tut . Entfernen Sie einfach diewith
und verwenden Sie nacktrequests.get(...)
und Bob ist Ihr Onkel .quelle
Ich werde diese Informationen hinzufügen, da es mir schwer gefallen ist, einen asynchronen API-Aufruf zu verspotten.
Folgendes habe ich getan, um einen asynchronen Anruf zu verspotten.
Hier ist die Funktion, die ich testen wollte
Sie benötigen weiterhin die MockResponse-Klasse
Sie fügen die MockResponseAsync-Klasse hinzu
Hier ist der Test. Das Wichtigste hier ist, dass ich die Antwort vorher erstelle, da die Init- Funktion nicht asynchron sein kann und der Aufruf von getResponse asynchron ist, sodass alles ausgecheckt ist.
Wenn Sie eine bessere Möglichkeit haben, sagen Sie es mir, aber ich denke, es ist so ziemlich sauber.
quelle