J'essaie d'utiliser le package de simulation Pythons pour simuler le requests
module Pythons . Quels sont les appels de base pour me faire travailler dans le scénario ci-dessous?
Dans mon views.py, j'ai une fonction qui fait une variété d'appels request.get () avec une réponse différente à chaque fois
def myview(request):
res1 = requests.get('aurl')
res2 = request.get('burl')
res3 = request.get('curl')
Dans ma classe de test, je veux faire quelque chose comme ça, mais je ne peux pas comprendre les appels de méthode exacts
Étape 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'
Étape 2:
Appeler ma vue
Étape 3:
vérifier que la réponse contient «une réponse», «b réponse», «c réponse»
Comment puis-je terminer l'étape 1 (se moquer du module des demandes)?
Réponses:
Voici comment vous pouvez le faire (vous pouvez exécuter ce fichier tel quel):
Remarque importante: si votre
MyGreatClass
classe vit dans un package différent, par exemplemy.great.package
, vous devez vous moquermy.great.package.requests.get
au lieu de simplement 'request.get'. Dans ce cas, votre scénario de test ressemblerait à ceci:Prendre plaisir!
la source
from unittest import mock
parimport mock
et le reste fonctionne tel quel. Vous devez installer lemock
package séparément.mock_requests_get
besoins auyield
lieu de àreturn
cause du changement de retour des itérateurs dans Python 3.Essayez d'utiliser la bibliothèque de réponses . Voici un exemple tiré de leur documentation :
Il offre une commodité assez agréable par rapport à la configuration de toutes les moqueries vous-même.
Il y a aussi HTTPretty :
Ce n'est pas spécifique à la
requests
bibliothèque, plus puissant à certains égards, bien que je trouve qu'il ne se prête pas si bien à inspecter les requêtes qu'il a interceptées, ce qui seresponses
fait assez facilementIl y a aussi httmock .
la source
responses
faire correspondre une URL générique - c'est-à-dire, implémenter une logique de rappel comme "prendre la dernière partie de l'URL, la rechercher dans une carte et renvoyer la valeur correspondante". Est-ce possible et ça me manque juste?request
argument reçu par la fonction de rappel)Voici ce qui a fonctionné pour moi:
la source
from unittest import mock
. docs.python.org/3/library/unittest.mock.htmlJ'ai utilisé des requêtes-maquette pour écrire des tests pour un module séparé:
Et les tests:
la source
c'est ainsi que vous vous moquez de requests.post, changez-le en votre méthode http
la source
mockresponse.json = lambda: {'key': 'value'}
mockresponse.json.return_value = {"key": "value"}
Si vous voulez vous moquer d'une fausse réponse, une autre façon de le faire est d'instancier simplement une instance de la classe HttpResponse de base, comme ceci:
la source
HttpResponse
, plutôt que ... Base, a cependant fait l'affaire pour moi. Merci!Une façon possible de contourner les demandes est d'utiliser la bibliothèque betamax, elle enregistre toutes les demandes et après cela, si vous faites une demande dans la même URL avec les mêmes paramètres, le betamax utilisera la demande enregistrée, je l'ai utilisée pour tester le robot d'indexation Web et ça me fait gagner beaucoup de temps.
https://betamax.readthedocs.io/en/latest/
la source
Juste un indice utile pour ceux qui sont toujours en difficulté, convertissant d'urllib ou urllib2 / urllib3 en requêtes ET essayant de se moquer d'une réponse - J'obtenais une erreur légèrement déroutante lors de la mise en œuvre de ma simulation:
with requests.get(path, auth=HTTPBasicAuth('user', 'pass'), verify=False) as url:
Eh bien, bien sûr, si je savais quelque chose sur le
with
fonctionnement (je ne le savais pas), je saurais que c'était un contexte résiduel et inutile (du PEP 343 ). Inutile lors de l'utilisation de la bibliothèque de requêtes car elle fait essentiellement la même chose pour vous sous le capot . Retirez-lewith
et utilisez nurequests.get(...)
et Bob est votre oncle .la source
J'ajouterai ces informations car j'ai eu du mal à comprendre comment se moquer d'un appel api asynchrone.
Voici ce que j'ai fait pour simuler un appel asynchrone.
Voici la fonction que je voulais tester
Vous avez toujours besoin de la classe MockResponse
Vous ajoutez la classe MockResponseAsync
Voici le test. La chose importante ici est que je crée la réponse avant car la fonction init ne peut pas être asynchrone et l'appel à getResponse est asynchrone donc tout a été extrait.
Si vous avez une meilleure façon de le faire, dites-le moi, mais je pense que c'est assez propre comme ça.
la source