-->

.NET - 为什么只配置在单元测试允许的标准输出?(.NET - Why is disposin

2019-09-22 03:42发布

首先,我想指出的是,我真的不希望配置标准输出的...我只是想知道为什么我看到的描述的行为。 我没有写描述的恶意代码。

我使用的单元测试.NET 4,对于编码被测试.NET 3.5。 我使用的MSTest为.NET 4作为我的测试框架。

最近,我一直在努力与被扔,由于标准错误输出处置的失​​误错误的库。 (见LibTiff.NET ReadDirectory是给System.ObjectDisposedException只在单元测试 )。

这看起来像什么比较他们的代码:

using (TextWriter stderr = Console.Error)
{
    ...
}

基本上,不运行单元测试时,标准输出不设置,即使一个具体处置的,但运行单元测试时,它是允许的。

任何人都可以解释为什么在单元测试的情况下这样做,只有当标准输出是一次性的?

Answer 1:

调用释放的对象上的方法将抛出ObjectDisposedException 。 例如:

var textWriter = Console.Error;
textWriter.Dispose();
textWriter.WriteLine("Test");

最后一行应抛出异常。 只是它不总是这一点。

如果你细读BCL源代码,你可以看到, Console或者使用StreamWriter被挂接到任何一个“真正的”流(真正同步流作家)(例如控制台错误流),或者是不可用StreamWriter.Null

“真实” StreamWriter以一种特殊的方式构造使得它不是可关闭。 这意味着,即使你关闭(或处置它),它只是继续按预期发挥作用。

所以,如果你有一个“真实”的控制台流,你可以关闭Console.Error只要你想,无需关闭底层流多次。 你也不会得到任何ObjectDisposedException

如果连接到没有“真正的”流Console.Error关闭StreamWriter将关闭底层流(在这种情况下Stream.Null )不表现出特殊的非可合的行为,如果你尝试使用StreamWriter后你会得到一个ObjectDisposedException

底线是,你可以得到一个ObjectDisposedException如果你不具有真正的控制台流的应用程序过早关闭控制台流作家。

上述信息也适用于Console.Out



Answer 2:

这个问题可能是由于该MSTest的使用标准输出流的事实。 除了写时序进入流,当你运行测试,标准输出实际存储和测试结果可用。 通过标准输出流的处置,你可能会与测试框架的操作本身的干扰。

话虽这么说,这是一个错误 - 让你的测试显示你的东西,你不应该在第一时间做....幸运的是,图书馆已经纠正了这个错误,所以你应该在未来的好。



文章来源: .NET - Why is disposing of standard output only allowed during unit tests?