[英]Why does Assert.Multiple 'remember' an already caught assertion failure?
以下代码:
using NUnit.Framework;
namespace Sandbox {
public class Program {
public static void Main(string[] args) {
try {
Assert.Fail("Fail!");
} catch (Exception e) {
Console.WriteLine("Expected exception");
}
try {
Assert.Multiple(() => { Assert.True(true); });
} catch (Exception e) {
Console.WriteLine("Unexpected exception: " + e.Message);
}
}
}
}
印刷
预期异常
意外异常:失败!
为什么在第一个块中捕获的AssertionException
被Assert.Multiple
第二次拾取? 如果我只是做Assert.True(true);
, 不会抛出异常。
我认为这不重要,但我使用的是 .NET 6.0。
在(非常)旧的版本中,NUnit 使用异常来 (1) 报告错误,然后 (2) 终止当前测试 class 的测试。
然而,早在 2016 年,这两个功能就分开了。 必须这样做才能支持Assert.Multiple
并且在较小程度上警告断言Warn.If
和Warn.Unless
。 这些功能需要在报告错误后继续执行。
应该注意的是,大约 20 年来,用户一直被建议避免捕获 NUnit 异常。 那是因为这些异常是内部实现细节,可能会发生变化。 我应该说 NUnit 开发人员多年来一直在提供该建议。 不幸的是,其他人经常发布涉及捕获它们的代码。 :-) 不管怎样,六七年前不可避免的事情发生了:实现细节发生了变化。
除非您理解异常的含义,否则永远不要尝试处理或抑制异常,这是一条通用原则。 测试失败抛出的断言的意思是(现在)错误已经被记录下来,fixture 即将被终止。
这回答了您的“为什么”问题,但很可能不是很令人满意。 :-)
我怀疑这可能是一个 XY 问题。 也许您可能会发布另一个关于您要完成的确切目标的问题,我们可能会有另一个 go。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.