NUnit Assert.Throws 吞下控制台输出

NUnit Assert.Throws swallows console output

这是重现问题的示例程序:

[TestFixture] // NUnit ver. 3.9
public class IssueTest
{
    [Test]
    public void AssertThrowsConsoleIssue()
    {
        Console.WriteLine(1);
        Assert.Throws<Exception>(() =>
        {
            Console.WriteLine(2);
            throw new Exception("test");
        });
        Console.WriteLine(3);
    }
}

我希望输出是

1
2
3

但实际上是

1
3

我在调试单元测试时遇到了这个问题,发现缺少一些控制台日志输出。

对我来说,这看起来像是一个错误。有没有办法防止 Assert.Throws 吞噬控制台输出?

这是一个错误,您刚刚发现了它!通常需要确认错误,但看到您的示例我可以准确理解发生了什么。

Throws 创建一个临时的测试结果和上下文,我们将其丢弃。如果我们不这样做,抛出的异常将记录在结果中。显然,我们需要从临时结果中保存一些东西,包括文本输出。如果您可以在 GitHub.

上为此提交错误,那就太好了

作为解决方法,您可以按照 Roman 的建议使用异步委托。如果您这样做,Assert.Throws 将使用不会创建一次性上下文和结果的不同代码。

如果您就此提交错误,我会尝试为您提供更好的解决方法。 ;-)

我遇到了同样的问题,Roman 的 hack 解决了我的问题。 等待下一个修复版本:)