2013-01-14 8 views
11

Ich habe diese Assertion in meinem Test-CodeVerzögerte NUnit Assert Nachricht Auswertung

Assert.That(() => eventData.Count == 0, 
Is.True.After(notificationPollingDelay), 
"Received unexpected event with last event data" + eventData.Last().Description()); 

, die einige Bedingungen nach einer gewissen Zeit und bei einem Fehler behauptet erzeugt eine Nachricht. Es kann nicht ausgeführt werden, da die Nachrichtenzeichenfolge beim Start der Bestätigung und nicht beim Ende der Bestätigung erstellt wird. Daher ist die eventData Sammlung immer noch leer (wie es anfänglich ist) und der Versuch, die Description des letzten Elements in der Sammlung zu erhalten, schlägt fehl. Gibt es einen Workaround oder eine vernünftige Alternative dazu in NUnit oder muss ich in meinen Tests auf Thread.Sleep zurückgreifen?

PS: Ich benutze NUnit 2.5.10.

+1

Soweit ich weiß, ist das keine native NUnit-Syntax. Welche Assertion-Bibliothek verwenden Sie? –

+1

@DanielHilgarth - Dies ist eine gültige NUnit-Assert-Syntax, wenn das Constraint-basierte Modell verwendet wird. 'After' ist eine verzögerte Einschränkung http://www.nunit.org/index.php?p=delayedConstraint&r=2.6.2 –

+1

@manojlds: Danke für die Info. Für alle Interessierten: [DelayedConstraint] (http://www.nunit.org/index.php?p=delayedConstraint&r=2.5.10) in Kombination mit [EqualConstraint] (http://www.nunit.org/index.php) ? p = equalConstraint & r = 2.5.10) mit dem [constrained-based assert module] (http://www.nunit.org/index.php?p=constraintModel&r=2.5.10). –

Antwort

4

können Sie dieses Schema verwenden:

var constrain = Is.True.After(notificationPollingDelay); 
var condition = constrain.Matches(() => eventData.Count == 0); 
Assert.IsTrue(condition, 
       "Received unexpected event with last event data" + 
       eventData.Last().Description()); 

Diese Methode ist ähnlich wie die Verwendung Thread.sleep

+0

Ich mag, wie Sie den Code in diese logischen Schritte auseinander gezogen haben. Ich habe keinen Compiler zur Hand, um die Ergebnisse sofort zu überprüfen, ist die zweite Zeile (die Bedingung), wo die Wartezeit auftritt ?? Wenn dies der Fall ist, ist dies die bisher beste Lösung. – mtijn

+0

Pending tritt während der 'var Bedingung auf = constrain.Matches (() => eventData.Count == 0);'. Mit dem Compiler beim Schreiben dieses Codes überprüft :) –

1

Die einfachste Antwort lautet: "Fügen Sie diesen Text nicht in Ihre Fehlernachricht ein". Ich persönlich beinhalte fast nie eine Fehlermeldung; Wenn Ihr Test atomar genug ist, müssen Sie es nicht tun. Wenn ich einen kryptischen Fehler herausfinden muss, hilft normalerweise nur ein Debugger.

Wenn Sie es wirklich wollen, sollte dieser Code funktionieren, ohne die Threads selbst zu verwalten.

try 
{ 
    Assert.That(() => eventData.Count == 0, Is.True.After(notificationPollingDelay)); 
} 
catch(AssertionException) 
{ 
    throw new Exception("Received unexpected event with last event data" + eventData.Last().Description()); 
} 
+0

'nicht diesen Text in Ihre Fehlermeldung '- Sie geben Ein Ratschlag und brechen eines der wichtigsten Dinge in einem Test - Versuch zu fangen. Besonders eine Behauptung. -1 – manojlds

+1

LOL, ok @monojlds. – tallseth

2

In NUnit Version 3.50 I eine andere Syntax verwenden musste. Hier ist das Beispiel:

var constraint = Is.True.After(delayInMilliseconds: 100000, pollingInterval: 100); 
Assert.That(() => yourCondition, constraint); 


Dies wird prüfen, ob yourCondition wahr ist, eine bestimmte maximale Zeit warten, um die DelayedConstraint mit der Is.True.After Methode erstellt.

In diesem Beispiel ist die DelayedConstraint so konfiguriert, dass die maximale Zeit von 100 Sekunden alle 0,1 Sekunden abgefragt wird.

Siehe auch die ältere NUnit 2.5-Dokumentation für DelayedConstraint.