2013-01-14 198 views
11

我有這樣的斷言在我的測試代碼延遲NUnit的斷言消息評估

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

,經過一段時間後斷言某些條件,失敗時產生的消息。它無法運行,因爲消息字符串是在斷言啓動時構造的,而不是斷言結束時構造的。因此eventData集合仍然是空的(因爲它最初是這樣),並且嘗試獲取集合中最後一項的Description失敗。有沒有解決方法或體面的替代NUnit或我必須恢復使用Thread.Sleep在我的測試? PS:我正在使用NUnit 2.5.10。

+1

據我所知,這不是本機NUnit斷言的語法。你使用哪個斷言庫? –

+1

@DanielHilgarth - 使用基於約束的模型時,這是有效的NUnit斷言語法。 '後'是一個延遲的約束http://www.nunit.org/index.php?p=delayedConstraint&r=2.6.2 –

+1

@manojlds:謝謝你的信息。對於任何感興趣的人:[DelayedConstraint](http://www.nunit.org/index.php?p=delayedConstraint&r=2.5.10)結合[EqualConstraint](http://www.nunit.org/index.php) ?p = equalConstraint&r = 2.5.10)使用[基於約束的斷言模塊](http://www.nunit.org/index.php?p=constraintModel&r=2.5.10)。 –

回答

4

您可以使用此方案:

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()); 

這種方法類似於使用了Thread.Sleep

+0

我喜歡你如何將代碼拆分成這些邏輯步驟。我現在沒有編譯器方便地檢查結果,是等待發生的第二行(建立條件)?如果是這樣,我猜這是迄今爲止最好的解決方法.. – mtijn

+0

在var condition = constrain.Matches((=)=> eventData.Count == 0)期間發生待定。編寫這段代碼時用編譯器檢查:) –

1

最簡單的答案是「不要在失敗消息中包含該文本」。我個人幾乎從不包含失敗信息;如果你的測試足夠原子,你不需要這樣做。通常,如果我需要弄清楚一個神祕的失敗,那麼只有調試器有幫助。

如果你真的想這樣做,這段代碼應該工作,而不需要自己管理線程。

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

'不包括你的失敗消息中的文本 - 你給一個建議,並打破測試中最重要的一件事 - 嘗試抓住。特別是一個斷言。 -1 – manojlds

+1

大聲笑,好的@monojlds。 – tallseth

2

在NUnit的版本3.50,我不得不使用不同的語法。 這裏是例如:

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


這將測試yourCondition是否爲真使用由Is.True.After方法創建的DelayedConstraint等待一定的最大時間。

在此示例中,DelayedConstraint被配置爲每0.1秒使用100秒輪詢的最大時間。

請參閱DelayedConstraint的傳統NUnit 2.5文檔。