Tengo una clase que estoy probando que tiene como dependencia otra clase (una instancia de la cual pasa al método init de la CUT). Quiero simular esta clase usando la biblioteca Python Mock.Objeto Python Mock con un método llamado varias veces
Lo que tengo es algo así como:
mockobj = Mock(spec=MyDependencyClass)
mockobj.methodfromdepclass.return_value = "the value I want the mock to return"
assertTrue(mockobj.methodfromdepclass(42), "the value I want the mock to return")
cutobj = ClassUnderTest(mockobj)
Lo cual está bien, pero "methodfromdepclass" es un método con parámetros, y como tal Quiero crear un único objeto de burla, donde dependiendo de qué argumentos se pasan a methodfromdepclass devuelve diferentes valores.
La razón por la que deseo este comportamiento parametrizado es que quiero crear varias instancias de ClassUnderTest que contengan valores diferentes (cuyos valores se producen por lo que devuelve el mockobj).
Un poco lo que pienso (esto por supuesto no funciona):
mockobj = Mock(spec=MyDependencyClass)
mockobj.methodfromdepclass.ifcalledwith(42).return_value = "you called me with arg 42"
mockobj.methodfromdepclass.ifcalledwith(99).return_value = "you called me with arg 99"
assertTrue(mockobj.methodfromdepclass(42), "you called me with arg 42")
assertTrue(mockobj.methodfromdepclass(99), "you called me with arg 99")
cutinst1 = ClassUnderTest(mockobj, 42)
cutinst2 = ClassUnderTest(mockobj, 99)
# now cutinst1 & cutinst2 contain different values
¿Cómo lograr este tipo "ifcalledwith" de la semántica?
Impresionante, exactamente lo que necesitaba. No es un fan de la sintaxis, pero funciona increíble. ¡Gracias! –
Una advertencia que me gustaría añadir aquí en la que corrí cuando uso esta solución, que funciona muy bien, por cierto, es que si tiene excepciones como efectos secundarios, debe plantearlos, en lugar de devolverlos. La biblioteca Mock es buena para permitirle asignar una excepción al side_effect y descifrarlo, pero con este método tiene que hacer bricolaje. – ThatsAMorais