2010-06-04 7 views
5

Je suis un test unitaire d'une classe avec une propriété dont la valeur change souvent, en fonction de la communication reçue d'un autre composant. Si la classe ne reçoit aucune communication pendant 5 secondes, la propriété revient à une valeur par défaut.Tests unitaires avec timeouts

Il m'est facile de boucher et de simuler le composant communicant afin de déclencher les valeurs que je veux tester. Le problème est que si j'exécute mes tests unitaires sur une machine occupée (comme une machine de build), et qu'il y a un délai assez important pour que la propriété par défaut, mon test d'unité échoue. Comment testeriez-vous que cette propriété a la valeur correcte lors de la simulation de diverses conditions de communication? Une idée est de restructurer mon code afin que je puisse remplacer la partie de la classe qui contrôle le délai d'attente. Une autre consiste à écrire mon test unitaire de sorte qu'il puisse détecter s'il a échoué en raison d'un dépassement de délai et l'indique dans les résultats du test.

Répondre

3

Vous pouvez configurer la propriété de délai d'expiration, puis la définir sur une valeur suffisamment élevée dans vos tests unitaires (ou suffisamment faible si vous souhaitez tester le comportement de réinitialisation).

+0

j'ai choisi d'aller dans cette voie parce qu'il était la solution la plus simple pour ma situation. Les autres suggestions étaient super aussi. Merci a tous! –

3

Il existe le même problème de connexion lors de l'utilisation de DateTime.Now. Ayende described une astuce pour faire face à ce que j'ai aimé:

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

puis dans votre test:

[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); 
} 

Peut-être que vous pouvez exploiter la même astuce de parent pour votre délai d'attente?

+0

+1 Intéressant. –

7

Je voudrais essayer une approche différente. Les développeurs de jeux ont souvent besoin d'un moyen de contrôler le temps de jeu, par ex. pour la fonctionnalité d'avance rapide ou pour synchroniser les fréquences d'images. Ils introduisent un objet Timer, qui lit des mesures à partir d'une horloge matérielle ou d'une horloge simulée.

Dans votre cas, vous pouvez fournir une minuterie contrôlable pour vos tests unitaires et une minuterie qui délègue à l'heure du système en mode production. De cette façon, vous pouvez contrôler le temps qui passe pour votre scénario de test et donc comment le sous-test de classe doit réagir dans certaines conditions de temporisation.

Pseudo-code: