1

まず第一に、私は標準出力を処分したくないということを指摘したいと思います...説明した動作が見られる理由を知りたいだけです。説明されている悪いコードを書きませんでした。

単体テストには .NET 4 を使用し、テスト対象のコードには .NET 3.5 を使用しています。テスト フレームワークとして MSTest for .NET 4 を使用しています。

最近、標準エラー出力を破棄するという失敗のためにエラーをスローしていたライブラリで作業しています。( LibTiff.NET ReadDirectory が System.ObjectDisposedException Only During Unit Tests を与えているを参照してください)。

これは相対的に彼らのコードがどのように見えるかです:

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

基本的に、単体テストを実行していないときは、標準出力を破棄しても破棄しませんが、単体テストを実行している場合は許可されます。

単体テストのコンテキストでそうする場合にのみ、標準出力が使い捨てである理由を誰かが説明できますか?

4

2 に答える 2

3

破棄されたオブジェクトでメソッドを呼び出すと、 がスローされますObjectDisposedException。例えば:

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

最後の行は例外をスローする必要があります。ただし、常にそうであるとは限りません。

BCL ソース コードを熟読すると、「実際の」ストリーム (コンソール エラー ストリームなど) に接続されている (実際には同期化されたストリーム ライター) をConsole使用しているか、それが で利用できないかがわかります。StreamWriterStreamWriter.Null

「本物」StreamWriterは特別な方法で構築されているため、閉じることはできません。これは、それを閉じても (または破棄しても)、期待どおりに機能し続けることを意味します。

したがって、「実際の」コンソール ストリームがある場合はConsole.Error、基になるストリームを閉じずに、何度でも閉じることができます。また、あなたは何も得ませんObjectDisposedException

Console.Errorクロージングに接続された「実際の」ストリームがない場合StreamWriter、 は基になるストリーム (この場合Stream.Nullは ) を閉じますが、これは特殊なクローズ不可能な動作を示さず、StreamWriter後でを使用しようとするとObjectDisposedException.

ObjectDisposedException肝心なのは、実際のコンソール ストリームを持たないアプリケーションでコンソール ストリーム ライターを時期尚早に閉じると、エラーが発生する可能性があるということです。

上記の情報は にも適用されConsole.Outます。

于 2012-09-05T16:37:08.697 に答える
2

この問題は、MSTest が標準出力ストリームを使用することが原因である可能性があります。タイミングをストリームに書き込むことに加えて、テストを実行すると、標準出力が実際に保存され、テスト結果で使用できるようになります。標準出力ストリームを破棄することで、テスト フレームワークの操作自体に干渉する可能性があります。

そうは言っても、これはバグです。つまり、最初にすべきではないことがテストで示されています....幸いなことに、ライブラリはこのエラーを修正したので、将来はうまくいくはずです。

于 2012-09-05T16:09:09.137 に答える