Saya menulis komponen yang, mengingat file ZIP, perlu:
- Buka zip file.
- Temukan dll tertentu di antara file yang tidak di-zip.
- Muat dll melalui refleksi dan memanggil metode di atasnya.
Saya ingin menguji unit komponen ini.
Saya tergoda untuk menulis kode yang berhubungan langsung dengan sistem file:
void DoIt()
{
Zip.Unzip(theZipFile, "C:\\foo\\Unzipped");
System.IO.File myDll = File.Open("C:\\foo\\Unzipped\\SuperSecret.bar");
myDll.InvokeSomeSpecialMethod();
}
Tetapi orang-orang sering berkata, "Jangan menulis unit test yang bergantung pada sistem file, database, jaringan, dll."
Jika saya menulis ini dengan cara uji unit-friendly, saya kira itu akan terlihat seperti ini:
void DoIt(IZipper zipper, IFileSystem fileSystem, IDllRunner runner)
{
string path = zipper.Unzip(theZipFile);
IFakeFile file = fileSystem.Open(path);
runner.Run(file);
}
Yay! Sekarang bisa diuji; Saya bisa memberi makan di test dobel (mengolok-olok) ke metode DoIt. Tetapi berapa biayanya? Saya sekarang harus mendefinisikan 3 antarmuka baru hanya untuk membuat ini dapat diuji. Dan apa, tepatnya, yang saya uji? Saya sedang menguji bahwa fungsi Doit saya berinteraksi dengan baik dengan dependensinya. Itu tidak menguji bahwa file zip tidak di-zip dengan benar, dll.
Saya tidak merasa sedang menguji fungsionalitas lagi. Rasanya seperti saya hanya menguji interaksi kelas.
Pertanyaan saya adalah ini : apa cara yang tepat untuk menguji unit sesuatu yang tergantung pada sistem file?
sunting Saya menggunakan .NET, tetapi konsepnya dapat menerapkan kode Java atau asli juga.
myDll.InvokeSomeSpecialMethod();
mana Anda akan memeriksa apakah itu berfungsi dengan baik dalam situasi sukses dan gagal sehingga saya tidak akan menguji unit DoIt
tetapi DllRunner.Run
mengatakan bahwa menyalahgunakan tes UNIT untuk memeriksa ulang bahwa seluruh proses bekerja akan menjadi penyalahgunaan yang dapat diterima dan karena itu akan menjadi tes integrasi yang menyamarkan uji unit, aturan uji unit normal tidak perlu diterapkan secara ketat