首先,我想指出的是,我真的不希望配置标准输出的...我只是想知道为什么我看到的描述的行为。 我没有写描述的恶意代码。
我使用的单元测试.NET 4,对于编码被测试.NET 3.5。 我使用的MSTest为.NET 4作为我的测试框架。
最近,我一直在努力与被扔,由于标准错误输出处置的失误错误的库。 (见LibTiff.NET ReadDirectory是给System.ObjectDisposedException只在单元测试 )。
这看起来像什么比较他们的代码:
using (TextWriter stderr = Console.Error)
{
...
}
基本上,不运行单元测试时,标准输出不设置,即使一个具体处置的,但运行单元测试时,它是允许的。
任何人都可以解释为什么在单元测试的情况下这样做,只有当标准输出是一次性的?
调用释放的对象上的方法将抛出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
。
这个问题可能是由于该MSTest的使用标准输出流的事实。 除了写时序进入流,当你运行测试,标准输出实际存储和测试结果可用。 通过标准输出流的处置,你可能会与测试框架的操作本身的干扰。
话虽这么说,这是一个错误 - 让你的测试显示你的东西,你不应该在第一时间做....幸运的是,图书馆已经纠正了这个错误,所以你应该在未来的好。