2008-10-29 34 views
10

IDisposable numaralı kütüphane kod parçası üzerinde çalışıyorum. Yönetilen yol (using aracılığıyla) kolayca test edilebilir. Ancak finalizer hakkında merak ediyorum: System.GC.Collect() arayarak finalizer çalıştırmak için yeterli mi?Birim testi nasıl tanımlanabilir?

+0

Tanımlanabilir model için IDisposable'a sadık kalırsanız, bunu test eden birimin işe yarayacağından eminim. –

+0

üzgünüm, "Bu ünitenin test edilmesinin o kadar faydalı olacağından emin değilim ... –

+0

@Mitch: Yönetilen ve yönetilmeyen kaynakların doğru zamanda atılması için önemsiz değil, doğru şekilde uygulanması Söz konusu kütüphane kodu, tam olarak, _not_ testindeki bir noktayı görememekten sorumlu olduğu için ... –

cevap

8

Hayır, GC.Collect() çağrısı da bu çağırmak gerekir, eşzamansızsa:

System.GC.WaitForPendingFinalizers(); 
+1

Teşekkürler bir yığın! Neden istediğimi biliyordum :-) –

+1

Bence GC.Collect() kendisinin eşzamanlı olduğunu (yani Hafıza o zaman geri dönebilir) ama finalizatörler kendileri ayrı ayrı çalışırlar. Tamamen yanlış olsa da ... –

+0

Şimdi hem yapıyorum hem de test her zaman geçtim e. Yani, sonleştiriciden doğru uzatma noktası denir. –

0

IDisposable arabiriminden çıkmak ve Dispose numaralı bir aramayı bekler misiniz? Bu, en azından nesnenin gerçekte ne zaman bertaraf edildiğini görmenizi sağlar.

+0

Bir kesme noktası belirlemek, bunu keşfetmek için yeterlidir. Dispose() 'ın uygulamasının test edilip edilmediğini test ediyorum, –

0

Ben (Sonlandrmay haline getirme yolunda yalın düşünüyorum) başka bir yöntemi çağırmak ve test diğeri bunu yöntem ne istersen yapar. % 100 kod kapsamı elde edemezsiniz, ancak en azından, yöntemin nesnenin kaynaklarını uygun bir şekilde yayınladığını biliyorsunuzdur.

2

Dispose, Finalization, and Resource Management 'a baktığım konuyla ilgili en iyi referansı inceleyeceğim. Onların desen kullanma:

~ComplexCleanupBase() 
{ 
    Dispose(false); 
} 

public void Dispose() 
{ 
    Dispose(true); 
    GC.SuppressFinalize(this); 
} 

protected override void Dispose(bool disposing) 
{ 
    if (!disposed) 
    { 
     if (disposing) 
     { 
      // dispose-only, i.e. non-finalizable logic 
     } 

     // new shared cleanup logic 
     disposed = true; 
    } 

    base.Dispose(disposing); 
} 

Ölü basit Finalizer/Dispose() yöntemleri ve test edilebilir bir Dispose (bool) ile rüzgar. Kesinleştirme veya GC sınıfını kullanarak herhangi bir şeyi zorlamaya gerek yoktur.

+0

Evet, bunu tam olarak yapıyorum. MSDN'de önerilenlerin yalnızca küçük bir uyarlaması. –