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 回答
3

在 NUnit 3.50 版中,我不得不使用不同的语法。这是示例:

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


这将测试使用方法创建的yourCondition等待某个最大时间是否为真。DelayedConstraintIs.True.After

在此示例中,DelayedConstraint配置为使用 100 秒的最长轮询时间,每 0.1 秒轮询一次。

另请参阅有关DelayedConstraint的旧版 NUnit 2.5 文档。

于 2017-02-22T07:57:13.157 回答
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 回答