Python Unit Testing con dos objetos simulados, ¿cómo verificar el orden de las llamadas?

Estoy escribiendo una clase que organiza dos instrumentos (una unidad de fuente de alimentación controlable a distancia y un controlador de bus usado para controlar el dispositivo bajo prueba) para realizar todo tipo de mediciones en un dispositivo bajo prueba (DUT).

El acceso a ambos instrumentos se implementa como clases de Python y una referencia a cada uno está disponible para la nueva clase. El DUT es algo delicado y tiene una secuencia de encendido muy específica que involucra llamadas a la fuente de alimentación y al controlador del bus y tiene que ocurrir en ese orden específico para evitar dañar el DUT.

Ahora quiero escribir una prueba de unidad para esta clase. Actualmente estoy usando las pruebas de nos y el paquete simulado para esto. Así que mi idea fue burlarse de ambas clases de instrumentos y verificar el orden de llamada correcto para ellos.

Parece ser muy fácil verificar el orden de llamada para cada clase simulada. Por lo tanto, puedo averiguar si se ordenó a la fuente de alimentación que aplique correctamente el voltaje de la batería primero, luego el voltaje de dominio digital y luego el voltaje de dominio analógico. También puedo descubrir que los registros digitales se han progtwigdo a los valores correctos. Sin embargo, estoy atascado determinando si la llamada para escribir los registros digitales ocurrió entre la aplicación de la tensión de dominio digital y la tensión de dominio analógico.

Así que mi pregunta es: si tengo dos objetos simulados, ¿cómo puedo verificar un orden específico de llamadas entre esos objetos? Mi primer paso fue comprobar las marcas de tiempo de las llamadas, pero esas no parecen existir.

Lo que puede hacer es poner sus mockes en un nuevo objeto Mock() y verificar las llamadas de mock del nuevo mock. Quizás un ejemplo sea más sencillo de entender:

 >>> from unittest.mock import * >>> m0, m1 = Mock(), Mock() >>> m = Mock() >>> m.m0, m.m1 = m0, m1 >>> m0()  >>> m1()  >>> m.mock_calls [call.m0(), call.m1()] 

Ok, ahora estamos en una buena posición: solo podemos verificar las llamadas de m para verificar el orden correcto:

 >>> m.assert_has_calls([call.m0(), call.m1()]) >>> m.assert_has_calls([call.m1(), call.m0()]) Traceback (most recent call last): File "", line 1, in  File "/usr/local/lib/python2.7/dist-packages/mock.py", line 863, in assert_has_calls 'Actual: %r' % (calls, self.mock_calls) AssertionError: Calls not found. Expected: [call.m1(), call.m0()] Actual: [call.m0(), call.m1()] 

Como queremos la primera pasada y el orden inverso fallan.

Cuando use el patch simplemente tome los simulacros devueltos por los parches y colóquelos en un nuevo Mock() como contenedor. Haga su cheque en el contenedor que registra el pedido de llamadas secundarias.