Estoy tratando de usar el paquete simulado Pythons para simular el requests
módulo Pythons . ¿Cuáles son las llamadas básicas para que trabaje en el siguiente escenario?
En mi views.py, tengo una función que hace una variedad de llamadas request.get () con diferentes respuestas cada vez
def myview(request):
res1 = requests.get('aurl')
res2 = request.get('burl')
res3 = request.get('curl')
En mi clase de prueba quiero hacer algo como esto, pero no puedo entender las llamadas a métodos exactos
Paso 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'
Paso 2:
Llama mi vista
Paso 3:
verificar respuesta contiene 'una respuesta', 'b respuesta', 'c respuesta'
¿Cómo puedo completar el Paso 1 (burlándose del módulo de solicitudes)?
Respuestas:
Así es como puede hacerlo (puede ejecutar este archivo tal cual):
Nota importante: si su
MyGreatClass
clase vive en un paquete diferente, digamosmy.great.package
, debe burlarse enmy.great.package.requests.get
lugar de simplemente 'request.get'. En ese caso, su caso de prueba se vería así:¡Disfrutar!
fuente
from unittest import mock
conimport mock
y el resto funciona como está. Necesita instalar elmock
paquete por separado.mock_requests_get
necesario enyield
lugar dereturn
debido al cambio en los iteradores que regresan en Python 3.Intenta usar la biblioteca de respuestas . Aquí hay un ejemplo de su documentación :
Proporciona una comodidad bastante agradable sobre la configuración de todas las burlas usted mismo.
También hay HTTPretty :
No es específico de la
requests
biblioteca, de alguna manera es más potente, aunque descubrí que no se presta muy bien para inspeccionar las solicitudes que interceptó, lo queresponses
es bastante fácil.También hay httmock .
fuente
responses
hacer coincidir una url comodín, es decir, implementar una lógica de devolución de llamada como "tomar la última parte de la url, buscarla en un mapa y devolver el valor correspondiente". ¿Es eso posible y me lo estoy perdiendo?request
argumento recibido por la función de devolución de llamada)Esto es lo que funcionó para mí:
fuente
from unittest import mock
. docs.python.org/3/library/unittest.mock.htmlUsé peticiones simuladas para escribir pruebas para un módulo separado:
Y las pruebas:
fuente
así es como se burlan de request.post, cámbielo a su método http
fuente
mockresponse.json = lambda: {'key': 'value'}
mockresponse.json.return_value = {"key": "value"}
Si desea burlarse de una respuesta falsa, otra forma de hacerlo es simplemente instanciar una instancia de la clase base HttpResponse, de esta manera:
fuente
HttpResponse
, en lugar de ... Base, hizo el truco para mí. ¡Gracias!Una posible forma de evitar las solicitudes es usar la biblioteca betamax, registra todas las solicitudes y luego, si realiza una solicitud en la misma URL con los mismos parámetros, betamax usará la solicitud registrada, la he estado usando para probar el rastreador web y me ahorró mucho tiempo
https://betamax.readthedocs.io/en/latest/
fuente
Solo una sugerencia útil para aquellos que todavía están luchando, convirtiendo de urllib o urllib2 / urllib3 a solicitudes Y tratando de burlarse de una respuesta: recibí un error un poco confuso al implementar mi simulación:
with requests.get(path, auth=HTTPBasicAuth('user', 'pass'), verify=False) as url:
Bueno, por supuesto, si supiera algo sobre cómo
with
funciona (no lo sé), sabría que es un contexto vestigial e innecesario (de PEP 343 ). Innecesario cuando se utiliza la biblioteca de solicitudes, ya que básicamente hace lo mismo para usted bajo el capó . Solo quítatelowith
y usa desnudorequests.get(...)
y Bob es tu tío .fuente
Agregaré esta información ya que me costó mucho imaginarme cómo burlarme de una llamada API asíncrona.
Esto es lo que hice para burlarme de una llamada asincrónica.
Aquí está la función que quería probar
Aún necesitas la clase MockResponse
Agrega la clase MockResponseAsync
Aquí está la prueba. Lo importante aquí es crear la respuesta antes, ya que la función init no puede ser asíncrona y la llamada a getResponse es asíncrona, por lo que todo se verificó.
Si tienes una mejor manera de hacerlo, dímelo pero creo que es bastante limpio así.
fuente