uso usa tutorial resueltos que programar llamar hace funciones funcion ejercicios def crear como python function mocking python-mock

usa - que hace la funcion return en python



Verificación de orden de llamadas a través de múltiples simulacros (1)

Defina un administrador de Mock y adjúntele attach_mock() mediante attach_mock() . A continuación, compruebe los mock_calls :

@patch(''module.a'') @patch(''module.b'') @patch(''module.c'') def test_main_routine(c, b, a): manager = Mock() manager.attach_mock(a, ''a'') manager.attach_mock(b, ''b'') manager.attach_mock(c, ''c'') module.main_routine() expected_calls = [call.a(''a''), call.b(''b''), call.c(''c'')] assert manager.mock_calls == expected_calls

Solo para probar que funciona, cambie el orden de las llamadas a funciones en la función main_routine() vea que lanza AssertionError .

Ver más ejemplos en Seguimiento del orden de las llamadas y aserciones de llamadas menos detalladas.

Espero que ayude.

Tengo tres funciones que estoy tratando de probar el orden de llamada de.

Digamos que en el módulo module.py tengo los siguientes

# module.py def a(*args): # do the first thing def b(*args): # do a second thing def c(*args): # do a third thing def main_routine(): a_args = (''a'') b_args = (''b'') c_args = (''c'') a(*a_args) b(*b_args) c(*c_args)

Quiero comprobar que se llama b después de a, y antes de c. Así que obtener un simulacro para cada uno de a, byc es fácil:

# tests.py @mock.patch(''module.a'') @mock.patch(''module.b'') @mock.patch(''module.c'') def test_main_routine(c_mock, b_mock, a_mock): # test all the things here

Verificar que cada una de las simulaciones individuales se llame también es fácil. ¿Cómo verifico el orden de las llamadas entre sí?

call_args_list no funcionará ya que se mantiene por separado para cada simulacro.

He intentado usar un efecto secundario para registrar cada una de las llamadas:

calls = [] def register_call(*args): calls.append(mock.call(*args)) return mock.DEFAULT a_mock.side_effect = register_call b_mock.side_effect = register_call c_mock.side_effect = register_call

Pero esto solo me da el argumento de que los mocks se llamaron, pero no el mock real contra el que se hizo la llamada. Puedo añadir un poco más de lógica:

# tests.py from functools import partial def register_call(*args, **kwargs): calls.append(kwargs.pop(''caller'', None), mock.call(*args, **kwargs)) return mock.DEFAULT a_mock.side_effect = partial(register_call, caller=''a'') b_mock.side_effect = partial(register_call, caller=''b'') c_mock.side_effect = partial(register_call, caller=''c'')

Y eso parece hacer el trabajo ... ¿Pero hay una mejor manera? Se siente como que ya debería haber algo en la API que pueda hacer esto que me estoy perdiendo.