11

テストコードにこのアサートがあります

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 を使用しています。

4

3 に答える 3

7

次のスキームを使用できます。

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 の使用に似ています。

于 2014-11-22T19:18:54.113 に答える
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());
}
于 2013-01-14T14:29:24.590 に答える