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?
cevap
Hayır, GC.Collect() çağrısı da bu çağırmak gerekir, eşzamansızsa:
System.GC.WaitForPendingFinalizers();
Teşekkürler bir yığın! Neden istediğimi biliyordum :-) –
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 ... –
Şimdi hem yapıyorum hem de test her zaman geçtim e. Yani, sonleştiriciden doğru uzatma noktası denir. –
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.
Bir kesme noktası belirlemek, bunu keşfetmek için yeterlidir. Dispose() 'ın uygulamasının test edilip edilmediğini test ediyorum, –
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.
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.
Evet, bunu tam olarak yapıyorum. MSDN'de önerilenlerin yalnızca küçük bir uyarlaması. –
Tanımlanabilir model için IDisposable'a sadık kalırsanız, bunu test eden birimin işe yarayacağından eminim. –
üzgünüm, "Bu ünitenin test edilmesinin o kadar faydalı olacağından emin değilim ... –
@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 ... –