2016-04-26 18 views
4

IDisposableを実装しているオブジェクトをNUnitで破棄してもクリーンアップできませんか?メソッド内にオブジェクトを配置する方法はさまざまですが、たとえば、オブジェクトが破棄される前にメソッドが失敗した場合など、NUnitはそれを処理しますか? (参考のため、私はv2.6以上です)IDisposableを実装するオブジェクトをNUnitで破棄しますか?

IDisposableを実装するオブジェクトが作成されているが、作成時に例外がスローされると主張している特定の理由があります。テストが失敗し、オブジェクトが作成された場合、私はメモリリークの問題に遭遇したくありません。

例:私はこれが動作することを実現

//Will the StreamReader instance here be disposed 
//Of if the assertion fails, and the instance is created? 
Assert.Throws<Exception>(() => new StreamReader(filename)); 

Assert.Throws<Exception>(() => 
{ 
    using (StreamReader sr = new StreamReader(filename)) { } 
} 

しかし、NUnitのは、必要なときに処分の世話をする場合、それは単に不要なコードのように思えます。

+3

IDisposableを安全に処理できるように他のものが参照していないことをNUnitが確実に知る方法はありません。アサートが参照されたオブジェクトを誤って処分するケースに遭遇したくない。ただし、テストするのは難しいことではなく、ダミーの使い捨てオブジェクトを作成し、破棄ポイントを設定し、呼び出されたスタックトレースをチェックしてください。 –

+0

@JoachimIsaksson もしテストが互いに依存していないので、NUnitが各テストケースの終わりにすべてのオブジェクトを処理してしまうのではないかと疑問に思っています。テストケースで作成されたものは理論的にはテストは完了です。 私は標準的なIDisposableの慣行に従うのは問題ありませんが、誰かがこれについて決定的な答えを持っているのだろうかと思います。 – user2338408

+1

私は@ジョアキムに同意します。追加するだけで、あなたの質問に 'Assert.Throws(using ...) 'を使うのではなく、おそらくオブジェクトを破棄するための' [TearDown] 'を追加する方がいいでしょう。 – Chris

答えて

7

いいえ、NUnitはそのように使用するとオブジェクトを破棄しません。 NUnit 3.xはIDisposableのテストフィクスチャを処分しますが、それはそれです。

あなたはNUnitがあなたのためにそれを行うことができますが、それは間違っているので、処分する必要はないようです。あなたの例のコードでは、IDisposableオブジェクトをNUnitに渡すように見えますが、IDisposableオブジェクトを含むデリゲート/ラムダ/コードブロックを渡しています。

Assert.Throwsの署名は、次のとおりです。

public static TActual Throws<TActual>(TestDelegate code) where TActual : Exception 

オブジェクトではなく、TestDelegateであることに注意してください。 TestDelegateがちょうどボイドデリゲート、

public delegate void TestDelegate(); 

であるあなたがStreamReaderに渡しているかのようにあなたのコードを読んでいるが、あなたは実際にデリゲートで、または他の言葉でNUnitのは、メソッド呼び出しを渡しています。 NUnitはあなたがそのメソッドで何をするかを知らない、または気にしません。他の方法と同様に、作成するオブジェクトを処分するのはあなた次第です。

+0

本当に応答することはあまりありません。あなたの返事は完全に意味があります。答えてくれてありがとう。 – user2338408

関連する問題