延迟的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.
您可以使用以下方案:
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());
}