延迟的NUnit Assert消息计算

本文关键字:消息 计算 Assert NUnit 延迟 | 更新日期: 2023-09-27 17:53:08

我在我的测试代码中有这个断言

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.

延迟的NUnit Assert消息计算

您可以使用以下方案:

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

这个方法类似于use Thread。睡眠

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

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

这将使用is . true创建的DelayedConstraint来测试' yourCondition '是否为真,等待一定的最大时间。后的方法。

在本例中,DelayedConstraint配置为每0.1秒轮询最大时间为100秒。

参见遗留的NUnit 2.5文档中的DelayedConstraint

最简单的答案是"不要在失败消息中包含该文本"。我个人几乎从不包含失败信息;如果您的测试是原子性的,则不需要这样做。通常,如果我需要找出一个神秘的失败,只有调试器才有帮助。

如果你真的想这样做,这段代码应该可以在不管理线程的情况下工作。

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