2010-06-04 15 views
5

Estoy probando una clase con una propiedad cuyo valor cambia a menudo, dependiendo de la comunicación que recibe de otro componente. Si la clase no recibe ninguna comunicación durante 5 segundos, la propiedad revierte a un valor predeterminado.Pruebas unitarias con tiempos de espera

Es fácil para mí rescindir y simular el componente de comunicación para activar los valores que deseo probar. El problema es que si ejecuto mis pruebas de unidad en una máquina que está ocupada (como una máquina de compilación), y hay una demora lo suficientemente significativa como para causar que la propiedad sea predeterminada, entonces mi prueba de unidad fallará.

¿Cómo se verifica para asegurarse de que esta propiedad tiene el valor adecuado cuando se simulan diversas condiciones de comunicación?

Una idea es reestructurar mi código para que pueda resguardar la parte de la clase que controla el tiempo de espera. Otra es escribir mi prueba unitaria de modo que pueda detectar si falló debido a un tiempo de espera e indica que en los resultados de la prueba.

Respuesta

3

Puede hacer que la propiedad de tiempo de espera sea configurable, luego ajústelo a un valor lo suficientemente alto en las pruebas de su unidad (o lo suficientemente bajo, si desea probar el comportamiento de reinicio de la unidad).

+0

que optó por seguir este camino porque era la solución más simple para mi situación. Las otras sugerencias también fueron geniales. ¡Gracias a todos! –

3

Existe el mismo problema al usar DateTime.Now. Ayende described un truco para tratar con él que me ha gustado:

public static class SystemTime 
{ 
    public static Func<DateTime> Now =() => DateTime.Now; 
} 

y luego en su prueba:

[Test] 
public void Should_calculate_length_of_stay_from_today_when_still_occupied() 
{ 
    var startDate = new DateTime(2008, 10, 1); 
    SystemTime.Now =() => new DateTime(2008, 10, 5); 

    var occupation = new Occupation {StartDate = startDate}; 

    occupation.LengthOfStay().ShouldEqual(4); 
} 

tal vez usted puede aprovechar el mismo truco familiares por su tiempo de espera?

+0

+1 Interesante. –

7

Probaría un enfoque diferente. Los desarrolladores de juegos a menudo necesitan una forma de controlar el tiempo del juego, p. para una funcionalidad de avance rápido o para sincronizar velocidades de cuadros. Introducen un objeto Timer, que lee marcas desde un reloj de hardware o desde un reloj simulado.

En su caso, podría proporcionar un temporizador controlable para las pruebas de su unidad y un temporizador que delegue a la hora del sistema en modo de producción. De esta forma, puede controlar el tiempo que pasa para su caso de prueba y, por lo tanto, cómo debe reaccionar la clase bajo prueba en determinadas condiciones de tiempo de espera.

Pseudo-código: