2010-06-04 15 views
5

Ich bin Einheit, die eine Klasse mit einer Eigenschaft testen, deren Wert sich häufig ändert, abhängig von der Kommunikation, die sie von einer anderen Komponente erhält. Wenn die Klasse 5 Sekunden lang keine Kommunikation empfängt, wird die Eigenschaft auf einen Standardwert zurückgesetzt.Komponententests mit Timeouts

Es ist einfach für mich, die kommunizierende Komponente zu stubben und zu verspotten, um die Werte auszulösen, für die ich testen möchte. Das Problem ist, dass, wenn ich meine Komponententests auf einem Computer ausfühle, der beschäftigt ist (wie ein Build-Rechner), und es eine ausreichend lange Verzögerung gibt, um die Eigenschaft als Standard festzulegen, dann wird mein Komponententest fehlschlagen.

Wie testen Sie, um sicherzustellen, dass diese Eigenschaft den richtigen Wert bei der Simulation verschiedener Kommunikationsbedingungen hat?

Eine Idee ist es, meinen Code neu zu strukturieren, so dass ich den Teil der Klasse, der das Timeout steuert, stopfen kann. Ein anderer besteht darin, meinen Komponententest so zu schreiben, dass er erkennen kann, ob er aufgrund einer Zeitüberschreitung ausgefallen ist, und dies in den Testergebnissen anzeigt.

Antwort

3

Sie können die Timeout-Eigenschaft konfigurierbar machen und sie dann auf einen ausreichend hohen Wert in Ihren Unit-Tests setzen (oder niedrig genug, wenn Sie das Reset-Verhalten testen möchten).

+0

Ich wählte diesen Weg zu gehen, weil es die einfachste Lösung für meine Situation war. Die anderen Vorschläge waren auch sehr gut. Danke allen! –

3

Es gibt das gleiche comon Problem, wenn Sie DateTime.Now verwenden. Ayende described ein Trick, um damit umzugehen, dass ich möchte:

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

und dann in Ihrem 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); 
} 

Vielleicht den gleichen kin Trick für Ihren Timeout nutzen Sie?

+0

+1 Interessant. –

7

Ich würde einen anderen Ansatz versuchen. Spieleentwickler benötigen oft einen Weg, um die Spielzeit zu steuern, z.B. für die Schnellvorlauffunktion oder zum Synchronisieren von Bildraten. Sie führen ein Objekt Timer ein, das Ticks von einer Hardware-Uhr oder von einer simulierten Uhr liest.

In Ihrem Fall könnten Sie einen steuerbaren Timer für Ihre Komponententests und einen Timer bereitstellen, der im Produktionsmodus die Systemzeit annimmt. Auf diese Weise können Sie steuern, welche Zeit für Ihren Testfall vergeht und wie die getestete Klasse unter bestimmten Timeout-Bedingungen reagieren muss.

Pseudo-Code: