Ahora, me enfrento a una situación en la que quiero devolver un valor fijo cuando el parámetro de entrada tiene un valor particular. Entonces, si digamos que “my_param” es igual a “algo”, entonces quiero devolver “my_cool_mock”
He estado buscando cómo lograr lo mismo con Mock sin éxito.
¿Algunas ideas?
Puede ser que esta respuesta ayude – stackoverflow.com/a/7665754/234606
– naiquevin
23 de abril de 2013 a las 6:05
@naiquevin Esto resuelve perfectamente el problema amigo, ¡gracias!
– Juan Antonio Gómez Moriano
23 de abril de 2013 a las 6:18
No tenía idea de que pudieras usar Mocktio con Python, ¡+1 para eso!
– ben
23 de junio de 2016 a las 16:28
Si su proyecto usa pytest, para tal fin, es posible que desee aprovechar monkeypatch. Monkeypatch es más para “reemplazar esta función por el bien de la prueba”, mientras que Mock es lo que usa cuando también desea verificar el mock_calls o hacer aseveraciones sobre cómo se llamaba y así sucesivamente. Hay un lugar para ambos y, a menudo, uso ambos en diferentes momentos en un archivo de prueba determinado.
– m_flor
8 oct 2018 a las 22:51
Posible duplicado del objeto Python Mock con el método llamado varias veces
– Melebio
12 de junio de 2019 a las 12:59
Ámbar
Si side_effect_func es una función, entonces lo que devuelva esa función es lo que llama al retorno simulado. los side_effect_func La función se llama con los mismos argumentos que el simulacro. Esto le permite variar el valor de retorno de la llamada dinámicamente, según la entrada:
Solo para facilitar la respuesta, ¿podría cambiar el nombre de la función side_effect a otra cosa? (lo sé, lo sé, es bastante simple, pero mejora la legibilidad el hecho de que el nombre de la función y el nombre del parámetro sean diferentes 🙂
– Juan Antonio Gómez Moriano
23 de abril de 2013 a las 6:21
@JuanAntonioGomezMoriano Podría, pero en este caso solo estoy citando directamente la documentación, por lo que detesto un poco editar la cita si no está específicamente rota.
@Ish no se están quejando del nombre de CallableMixin.side_effectpero que la función separada definida en el ejemplo tiene el mismo nombre.
– perro naranja
8 de mayo de 2018 a las 14:54
Juan Antonio Gómez Moriano
Como se indica en el objeto Python Mock con el método llamado varias veces
Una solución es escribir mi propio efecto secundario
def my_side_effect(*args, **kwargs):
if args[0] == 42:
return "Called with 42"
elif args[0] == 43:
return "Called with 43"
elif kwargs['foo'] == 7:
return "Foo is seven"
mockobj.mockmethod.side_effect = my_side_effect
eso hace el truco
Esto me dejó más claro que la respuesta seleccionada, así que gracias por responder a su propia pregunta 🙂
-Luca Bezerra
10 de agosto de 2018 a las 19:59
Muchas gracias. ¡Esto aclaró mucha confusión y fue fácil de entender!
– Xonshiz
5 de marzo a las 12:26
El efecto secundario tiene una función (que también puede ser un función lambda), por lo que para casos simples puede usar:
m = MagicMock(side_effect=(lambda x: x+1))
Arseni Panfilov
Si usted “quiero devolver un valor fijo cuando el parámetro de entrada tiene un valor particular”tal vez ni siquiera necesites un simulacro y te vendría bien un dict junto con su get método:
Esto funciona bien cuando la salida de su falsificación es un cartografía de entrada cuando es un función de entrada que sugeriría usar side_effect según Ámbarla respuesta
También puede utilizar una combinación de ambos si desea conservar Mockcapacidades de (assert_called_once, call_count etc):
Espero que este paquete pueda hacer que las pruebas sean más agradables. Siéntase libre de dar cualquier comentario.
Hernán
También puedes usar partial de functools si quiere usar una función que toma parámetros pero la función de la que se está burlando no. Por ejemplo, así:
Esto devolverá un invocable que no acepta parámetros (como timezone.now() de Django), pero mi función mock_year sí.
Gracias por esta elegante solución. Me gusta agregar que si su función original tiene parámetros adicionales, deben llamarse con palabras clave en su código de producción o este enfoque no funcionará. Obtienes el error: got multiple values for argument.
– Erik Kalkoken
6 de marzo de 2020 a las 10:43
¿Ha sido útil esta solución?
Tu feedback nos ayuda a saber si la solución es correcta y está funcionando. De esta manera podemos revisar y corregir el contenido.
Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos.
Configurar y más información
Puede ser que esta respuesta ayude – stackoverflow.com/a/7665754/234606
– naiquevin
23 de abril de 2013 a las 6:05
@naiquevin Esto resuelve perfectamente el problema amigo, ¡gracias!
– Juan Antonio Gómez Moriano
23 de abril de 2013 a las 6:18
No tenía idea de que pudieras usar Mocktio con Python, ¡+1 para eso!
– ben
23 de junio de 2016 a las 16:28
Si su proyecto usa pytest, para tal fin, es posible que desee aprovechar
monkeypatch
. Monkeypatch es más para “reemplazar esta función por el bien de la prueba”, mientras que Mock es lo que usa cuando también desea verificar elmock_calls
o hacer aseveraciones sobre cómo se llamaba y así sucesivamente. Hay un lugar para ambos y, a menudo, uso ambos en diferentes momentos en un archivo de prueba determinado.– m_flor
8 oct 2018 a las 22:51
Posible duplicado del objeto Python Mock con el método llamado varias veces
– Melebio
12 de junio de 2019 a las 12:59