繁体   English   中英

为什么 Assert.Multiple ‘记住’一个已经捕获的断言失败?

[英]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);
            }
        }
    }
}

印刷

预期异常
意外异常:失败!

为什么在第一个块中捕获的AssertionExceptionAssert.Multiple第二次拾取? 如果我只是做Assert.True(true); , 不会抛出异常。

我认为这不重要,但我使用的是 .NET 6.0。

在(非常)旧的版本中,NUnit 使用异常来 (1) 报告错误,然后 (2) 终止当前测试 class 的测试。

然而,早在 2016 年,这两个功能就分开了。 必须这样做才能支持Assert.Multiple并且在较小程度上警告断言Warn.IfWarn.Unless 这些功能需要在报告错误后继续执行。

应该注意的是,大约 20 年来,用户一直被建议避免捕获 NUnit 异常。 那是因为这些异常是内部实现细节,可能会发生变化。 我应该说 NUnit 开发人员多年来一直在提供该建议。 不幸的是,其他人经常发布涉及捕获它们的代码。 :-) 不管怎样,六七年前不可避免的事情发生了:实现细节发生了变化。

除非您理解异常的含义,否则永远不要尝试处理或抑制异常,这是一条通用原则。 测试失败抛出的断言的意思是(现在)错误已经被记录下来,fixture 即将被终止。

这回答了您的“为什么”问题,但很可能不是很令人满意。 :-)

我怀疑这可能是一个 XY 问题。 也许您可能会发布另一个关于您要完成的确切目标的问题,我们可能会有另一个 go。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM