延迟 NUnit Assert 消息评估

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。


1
据我所知,NUnit没有本地的断言语法。您使用哪个断言库? - Daniel Hilgarth
1
@DanielHilgarth - 当使用基于约束的模型时,这是有效的 NUnit 断言语法。After 是一个延迟约束 http://www.nunit.org/index.php?p=delayedConstraint&r=2.6.2。 - Mike Two
1
@manojlds:感谢提供信息。对于任何有兴趣的人:使用基于约束的断言模块中的DelayedConstraintEqualConstraint相结合。 - Daniel Hilgarth
1
我认为你运气不好。根据我在上一条评论中链接的文档,没有重载可以接受委托来在稍后创建消息。 - Daniel Hilgarth
1
<卢克的声音>嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯</卢克的声音> - mtijn
显示剩余2条评论
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


我喜欢你把代码分解成这些逻辑步骤的方式。目前手头没有编译器来检查结果,第二行(建立条件)是等待发生的地方吗??如果是,我猜这是到目前为止最好的解决方法了。 - mtijn
var condition = constrain.Matches(() => eventData.Count == 0); 中会出现Pending。在编写此代码时已通过编译器进行了检查 :) - Evgeniy Mironov

4
在 NUnit 3.50 版本中,我需要使用不同的语法。以下是示例:
var delayedConstraint = Is.True.After( delayInMilliseconds: 100000, pollingInterval: 100);
Assert.That( () => yourCondition, delayedConstraint );

在此示例中,DelayedConstraint 配置为最大时间为100秒,每0.1秒轮询一次。
另请参阅传统的 NUnit 2.5 文档中关于 DelayedConstraint 的内容。

0
最简单的答案是“不要在您的失败消息中包含该文本”。我个人几乎从不包括失败消息;如果您的测试足够原子化,您就不需要这样做。通常,如果我需要弄清楚一个神秘的失败,只有调试器才能帮助。

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

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

2
在你的失败消息中不要包含那段文字,这是你所给出的建议,却破坏了测试中最重要的事情之一——try-catch机制。特别是断言。-1 - manojlds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接