UnitTest Python simula solo una función llamada múltiple

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