Bir ZIP dosyası verilen, gereken bir bileşen yazıyorum:
- Dosyayı açın.
- Sıkıştırılmış dosyalar arasında belirli bir dll bulun.
- Bu dll yansıması ile yükleyin ve üzerine bir yöntem çağırmak.
Bu bileşeni birim test etmek istiyorum.
Doğrudan dosya sistemi ile ilgilenen kod yazmak için cazipim:
void DoIt()
{
Zip.Unzip(theZipFile, "C:\\foo\\Unzipped");
System.IO.File myDll = File.Open("C:\\foo\\Unzipped\\SuperSecret.bar");
myDll.InvokeSomeSpecialMethod();
}
Ancak insanlar sık sık "Dosya sistemine, veritabanına, ağa vb. Dayanan birim testleri yazma" diyorlar.
Bunu birim testi dostu bir şekilde yazacak olsaydım, sanırım şöyle olurdu:
void DoIt(IZipper zipper, IFileSystem fileSystem, IDllRunner runner)
{
string path = zipper.Unzip(theZipFile);
IFakeFile file = fileSystem.Open(path);
runner.Run(file);
}
Yaşasın! Şimdi test edilebilir; DoIt yöntemine test çiftlerini (sahte) besleyebilirim. Ama ne pahasına olursa olsun? Şimdi bunu sadece test edilebilir yapmak için 3 yeni arayüz tanımlamak zorunda kaldım. Ve tam olarak neyi test ediyorum? Benim DoIt işlevinin bağımlılıkları ile düzgün etkileşim olduğunu test ediyorum. Zip dosyasının düzgün şekilde açıldığını vb. Test etmez.
Artık işlevselliği test ediyormuşum gibi gelmiyor. Sadece sınıf etkileşimlerini test ediyormuşum gibi geliyor.
Benim sorum şudur : Dosya sistemine bağlı bir şeyi test etmenin doğru yolu nedir?
edit .NET kullanıyorum, ancak kavram Java veya yerel kodu da uygulayabilir.
myDll.InvokeSomeSpecialMethod();
nerede hem başarı hem de başarısız durumlarda doğru çalışıp çalışmadığını kontrol ederdi, bu yüzden birim testi olmazdı, DoIt
ancak DllRunner.Run
tüm sürecin çalışacağını iki kez kontrol etmek için bir UNIT testini yanlış kullanmanın kabul edilebilir bir yanlış kullanım ve bir birim testini maskeleyen bir entegrasyon testi olacağı için, normal birim test kurallarının kesinlikle uygulanması gerekmez