Estoy usando Mock ( http://www.voidspace.org.uk/python/mock/mock.html ), y encontré un caso falso en particular que no puedo encontrar la solución.
Tengo una función con varias llamadas a some_function que se está burlando.
def function(): some_function(1) some_function(2) some_function(3)
Solo quiero burlarme de la primera y tercera llamada a some_function. La segunda llamada que quiero que se haga al real some_function.
Probé algunas alternativas con http://www.voidspace.org.uk/python/mock/mock.html#mock.Mock.mock_calls , pero sin éxito.
Gracias de antemano por la ayuda.
Parece que el argumento wraps
podría ser lo que quieres:
envolturas : Elemento para el objeto simulado para envolver Si wraps no es None, la llamada al Mock pasará la llamada al objeto envuelto (devolviendo el resultado real e ignorando el valor de retorno).
Sin embargo, como solo desea que la segunda llamada no se burle, sugeriría el uso de mock.side_effect
.
Si side_effect es un iterable, entonces cada llamada a la simulación devolverá el siguiente valor del iterable.
Si desea devolver un valor diferente para cada llamada, es un ajuste perfecto:
somefunction_mock.side_effect = [10, None, 10]
Solo las primeras y terceras llamadas a somefunction
devolverán 10.
Sin embargo, si necesita llamar a la función real , pero no la segunda vez, también puede pasar side_effect
a side_effect
, pero me parece bastante feo (puede que haya una forma más inteligente de hacerlo):
class CustomMock(object): calls = 0 def some_function(self, arg): calls = calls + 1 if calls != 2: return my_real_function(arg) else: return DEFAULT somefunction_mock.side_effect = CustomMock().some_function
Incluso más simple que crear una clase CustomMock
:
def side_effect(*args, **kwargs): if side_effect.counter < 10: side_effect.counter += 1 return my_real_function(arg) else: return DEFAULT side_effect.counter = 0 mocked_method.side_effect = side_effect