Usiłuję użyć pakietu próbnego Pythons, aby wyśmiewać requests
moduł Pythons . Jakie są podstawowe wezwania do pracy w poniższym scenariuszu?
W moim views.py mam funkcję, która wykonuje różne wywołania requests.get () z różną odpowiedzią za każdym razem
def myview(request):
res1 = requests.get('aurl')
res2 = request.get('burl')
res3 = request.get('curl')
W mojej klasie testowej chcę zrobić coś takiego, ale nie mogę dokładnie określić wywołań metod
Krok 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'
Krok 2:
Zadzwoń do mojego widoku
Krok 3:
sprawdź odpowiedź zawiera „odpowiedź”, „b odpowiedź”, „c odpowiedź”
Jak mogę wykonać krok 1 (drwiąc z modułu żądań)?
Odpowiedzi:
Oto jak możesz to zrobić (możesz uruchomić ten plik tak, jak jest):
Ważna uwaga: jeśli twoja
MyGreatClass
klasa mieszka w innym pakiecie, powiedzmymy.great.package
, że musisz kpićmy.great.package.requests.get
zamiast po prostu „request.get”. W takim przypadku Twój przypadek testowy wyglądałby tak:Cieszyć się!
źródło
from unittest import mock
zimport mock
reszta działa jak jest. Musisz zainstalowaćmock
pakiet osobno.mock_requests_get
razie potrzeby,yield
zamiast zreturn
powodu zmiany w zwracaniu iteratorów w Pythonie 3.Spróbuj użyć biblioteki odpowiedzi :
zapewnia całkiem niezłą wygodę w samodzielnym konfigurowaniu wszystkich kpin
Istnieje również HTTPretty :
Nie jest specyficzny dla
requests
biblioteki, jest bardziej wydajny pod pewnymi względami, chociaż uważam, że nie nadaje się tak dobrze do sprawdzania przechwyconych żądań, coresponses
robi dość łatwoIstnieje również httmock .
źródło
responses
dopasowanie adresu URL z symbolem wieloznacznym - to znaczy zaimplementuj logikę wywołania zwrotnego, na przykład: „weź ostatnią część adresu URL, wyszukaj ją na mapie i zwróć odpowiednią wartość”. Czy to możliwe i po prostu mi tego brakuje?request
arg odebrane przez funkcję wywołania zwrotnego)Oto, co zadziałało dla mnie:
źródło
from unittest import mock
. docs.python.org/3/library/unittest.mock.htmlUżyłem próbnego zapytania do napisania testów dla osobnego modułu:
A testy:
źródło
w ten sposób kpisz z requests.post, zmień go na swoją metodę http
źródło
mockresponse.json = lambda: {'key': 'value'}
mockresponse.json.return_value = {"key": "value"}
Jeśli chcesz kpić z fałszywej odpowiedzi, innym sposobem jest po prostu utworzenie instancji podstawowej klasy HttpResponse, na przykład:
źródło
HttpResponse
, zamiast ... Podstawa, jednak załatwiła sprawę. Dzięki!Jednym z możliwych sposobów obejścia żądań jest użycie biblioteki betamax, rejestruje ona wszystkie żądania, a następnie, jeśli złożysz żądanie w tym samym adresie URL z tymi samymi parametrami, betamax użyje zarejestrowanego żądania, użyłem go do przetestowania robota sieciowego i to oszczędza mi dużo czasu.
https://betamax.readthedocs.io/en/latest/
źródło
Po prostu pomocna wskazówka dla tych, którzy wciąż się borykają, przechodząc z urllib lub urllib2 / urllib3 do żądań ORAZ próbując wyszydzić odpowiedź - otrzymałem nieco mylący błąd podczas implementacji mojej makiety:
with requests.get(path, auth=HTTPBasicAuth('user', 'pass'), verify=False) as url:
Oczywiście, gdybym wiedział cokolwiek o tym, jak
with
działa (nie wiedziałem), wiedziałbym, że był to szczątkowy, niepotrzebny kontekst (z PEP 343 ). Niepotrzebne przy korzystaniu z biblioteki żądań, ponieważ robi to samo pod maską . Wystarczy usunąćwith
i użyć goły,requests.get(...)
a Bob jest wujem .źródło
Dodam te informacje, ponieważ miałem trudności z wymyśleniem, jak wyśmiewać asynchroniczne wywołanie interfejsu API.
Oto, co zrobiłem, aby wyśmiewać połączenie asynchroniczne.
Oto funkcja, którą chciałem przetestować
Nadal potrzebujesz klasy MockResponse
Dodaj klasę MockResponseAsync
Oto test. Ważną rzeczą jest to, że tworzę odpowiedź wcześniej, ponieważ funkcja init nie może być asynchroniczna, a wywołanie getResponse jest asynchroniczne, więc wszystko zostało sprawdzone.
Jeśli masz lepszy sposób na zrobienie tego, powiedz mi, ale myślę, że to całkiem czyste.
źródło