Я пишу компонент, який, враховуючи ZIP-файл, повинен:
- Розпакуйте файл.
- Знайдіть конкретний dll серед розпакованих файлів.
- Завантажте цей dll за допомогою відображення та застосуйте метод на ньому.
Я хотів би перевірити цей компонент.
Мені спокуса написати код, який стосується безпосередньо файлової системи:
void DoIt()
{
Zip.Unzip(theZipFile, "C:\\foo\\Unzipped");
System.IO.File myDll = File.Open("C:\\foo\\Unzipped\\SuperSecret.bar");
myDll.InvokeSomeSpecialMethod();
}
Але люди часто кажуть: "Не пишіть одиничні тести, які покладаються на файлову систему, базу даних, мережу тощо".
Якби я писав це дружньою темою, я вважаю, що це виглядатиме так:
void DoIt(IZipper zipper, IFileSystem fileSystem, IDllRunner runner)
{
string path = zipper.Unzip(theZipFile);
IFakeFile file = fileSystem.Open(path);
runner.Run(file);
}
Так! Тепер це перевіряється; Я можу подавати тестові парні (макети) методу DoIt. Але якою ціною? Тепер мені довелося визначити 3 нові інтерфейси, щоб зробити цей тест. І що саме я тестую? Я перевіряю, чи моя функція DoIt належним чином взаємодіє з її залежностями. Це не перевіряє, чи не було розпаковано zip-файл належним чином тощо.
Не здається, що я вже перевіряю функціональність. Схоже, я просто тестую взаємодію класів.
Моє запитання таке : який правильний спосіб перевірити те, що залежить від файлової системи?
редагувати Я використовую .NET, але концепція також може застосовувати Java або власний код.
myDll.InvokeSomeSpecialMethod();
коли ви переконаєтесь, що вона працює правильно, як в успішних, так і в невдалих ситуаціях, тому я не став би тестуванням, DoIt
але DllRunner.Run
сказали, що неправильне використання тесту UNIT перевірить, чи працює весь процес прийнятне неправильне використання, і як це було б інтеграційним тестом, що маскує тест одиниці, нормальні правила тестування одиниці не потрібно застосовувати так суворо