2010-06-04 21 views
5

Jestem jednostką testującą klasę z właściwością, której wartość zmienia się często, w zależności od komunikacji, jaką otrzymuje z innego komponentu. Jeśli klasa nie otrzyma żadnej komunikacji przez 5 sekund, właściwość powraca do wartości domyślnej.Testy jednostkowe z limitami czasu

Jest mi łatwo odgadnąć i wyśmieszyć komponent komunikacyjny, aby wywołać wartości, które chcę przetestować. Problem polega na tym, że jeśli uruchomię testy jednostkowe na maszynie, która jest zajęta (jak maszyna budująca), i istnieje wystarczająco znaczące opóźnienie, aby spowodować, że właściwość będzie domyślna, to mój test jednostkowy zakończy się niepowodzeniem.

Jak można sprawdzić, aby upewnić się, że właściwość ma odpowiednią wartość podczas symulacji różnych warunków komunikacji?

Jednym z pomysłów jest restrukturyzacja mojego kodu tak, że mogę zablokować część klasy, która kontroluje limit czasu. Innym jest napisanie testu jednostki tak, aby mógł wykryć, czy nie powiodło się z powodu przekroczenia czasu i wskazuje to w wynikach testu.

Odpowiedz

3

Można ustawić właściwość limitu czasu, który można konfigurować, a następnie ustawić ją na wartość wystarczająco wysoką w testach jednostkowych (lub wystarczająco niską, aby przeprowadzić test jednostkowy działania resetowania).

+0

wybrałem tę drogę, ponieważ to było najprostsze rozwiązanie dla mojej sytuacji. Inne sugestie również były świetne. Dziękuje wszystkim! –

3

Występuje ten sam problem z połączeniem, gdy używany jest DateTime.Now. Ayende described trick do czynienia z tym, że mi się podobało:

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

a następnie w teście:

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

może można wykorzystać ten sam trik kin dla Timeout?

+0

+1 Interesujące. –

7

Spróbowałbym innego podejścia. Twórcy gier często potrzebują sposobu kontrolowania czasu gry, np. do szybkiego przewijania do przodu lub do synchronizowania liczby klatek na sekundę. Wprowadzają obiekt Timer, który odczytuje tiki z zegara sprzętowego lub z symulowanego zegara.

W twoim przypadku możesz dostarczyć kontrolowany czasomierz dla testów jednostkowych i zegar, który deleguje na czas systemowy w trybie produkcyjnym. W ten sposób możesz kontrolować czas, który mija dla twojego przypadku testowego, a tym samym, jak testowany obiekt musi reagować w określonych warunkach czasowych.

Pseudo-kod: