Я пытаюсь привыкнуть к написанию юнит-тестов, я уже писал несколько ранее, но они обычно были довольно простыми... Я хотел бы начать переходить на TDD, так как хочу улучшить качество моего кода (дизайн и структура) - уменьшение связи, в то же время, мы надеемся, уменьшить количество регрессий, которые переходят в тестируемую сборку.
Я взял относительно простой проект, над которым я работаю с самого начала. Результирующая программа просматривает папку, а затем воздействует на файлы в этой папке.
Вот типичный пример некоторого кода, извлеченного из проекта:
private string RestoreExtension(String file)
{
var unknownFile = Path.GetFileName(file);
var ignoreDir = Path.GetDirectoryName(file) + "\\Unknown";
string newFile;
//We need this library for determining mime
if (CheckLibrary("urlmon.dll"))
{
AddLogLine("Attempting to restore file extension");
var mime = GetMimeType(BufferFile(file, 256));
var extension = FileExtensions.FindExtension(mime);
if (!String.IsNullOrEmpty(extension))
{
AddLogLine("Found extension: " + extension);
newFile = file + "." + extension;
File.Move(file, newFile);
return newFile;
}
}
else
{
AddLogLine("Unable to load urlmon.dll");
}
AddLogLine("Unable to restore file extension");
if (!Directory.Exists(ignoreDir))
{
Directory.CreateDirectory(ignoreDir);
}
var time = DateTime.Now;
const string format = "dd-MM-yyyy HH-mm-ss";
newFile = ignoreDir + "\\" + unknownFile + "-" + time.ToString(format);
File.Move(file, newFile);
return String.Empty;
}
Вопросы:
Как я могу проверить метод, используя IO? Я действительно не хочу использовать настоящий файл, так как это будет медленным (и больше интеграционным тестом?), Но я действительно не вижу другого пути. Я мог бы добавить переключаемый слой абстракции ввода/вывода, но для меня это звучит так, как будто это может излишне усложнить код...
Стоит ли проводить подобный тестовый проект? Я имею в виду, это слишком просто. Как только вы убираете вызовы из .Net и сторонних библиотек, осталось не так уж много... Так значит ли это, что объем работы по его тестированию означает, что он не является хорошим кандидатом для тестирования?
Многие методы в этом проекте являются частными, так как этот проект является службой Windows. Я читал, что вам следует проверять только те методы, которые внешне видимы (общедоступны или доступны через интерфейс), однако в этом случае маловероятно, что я захочу предоставить какой-либо из моих собственных методов. Так стоит ли тестировать этот проект (поскольку id, вероятно, нужно либо изменить общедоступные модификаторы методов, либо добавить некоторые атрибуты, чтобы их мог видеть NUnit)?