Pertanyaan Apakah NUnit membuang objek yang menerapkan IDisposable?


Apakah NUnit membuang objek yang menerapkan IDisposable pada pembersihan? Saya menyadari ada berbagai cara saya bisa mendapatkan objek yang dibuang dalam metode, tetapi, misalnya, jika metode gagal sebelum objek yang dibuang - akankah NUnit mengurusnya? (Untuk referensi, saya menggunakan v2.6 +)

Alasan spesifik yang saya minta adalah untuk kasus di mana sebuah objek yang mengimplementasikan IDisposable dibuat, tetapi saya menegaskan bahwa pengecualian dilemparkan pada penciptaan. Jika pengujian gagal - dan objek dibuat, saya tidak ingin mengalami masalah kebocoran memori.

Contoh:

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

Saya menyadari bahwa ini akan berhasil:

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

Tapi sepertinya itu seperti kode yang tidak perlu jika NUnit akan mengurus pembuangan ketika diperlukan.


4
2018-04-26 14:49


asal


Jawaban:


Tidak, NUnit tidak akan membuang objek Anda saat digunakan dengan cara itu. NUnit 3.x akan membuang perlengkapan tes yang tidak dapat digunakan, tetapi hanya itu.

Anda menyatakan bahwa sepertinya tidak perlu dibuang karena NUnit dapat melakukannya untuk Anda, tetapi itu tidak benar. Dalam kode dalam contoh Anda, tampaknya Anda seperti Anda melewatkan NUnit objek IDisposable, tetapi pada kenyataannya Anda melewati blok delegasi / lambda / kode yang kebetulan mengandung objek IDisposable.

Anda akan melihat bahwa tanda tangan untuk Assert.Throws aku s;

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

Perhatikan bahwa dibutuhkan a TestDelegate, bukan objek. TestDelegate hanya delegasi batal,

public delegate void TestDelegate();

Anda membaca kode Anda seolah-olah Anda sedang melintas StreamReader, tetapi Anda benar-benar menyampaikan sebuah delegasi, atau dengan kata lain sebuah metode yang dipanggil NUnit. NUnit tidak tahu atau tidak peduli apa yang Anda lakukan dalam metode itu. Seperti metode lainnya, terserah Anda untuk membuang objek yang Anda buat.


8
2018-04-26 15:14