Я хотел бы начать использовать модульные тесты, но мне трудно понять, как я могу использовать их в моем текущем проекте.
Мой текущий проект - это приложение, которое собирает файлы в «Каталог». Каталог
затем может извлекать информацию из файлов, которые он содержит, такую как эскизы и другие свойства. Пользователи также могут помечать файлы другими настраиваемыми метаданными, такими как «Автор» и «Заметки». Его легко сравнить с приложением для создания фотоальбомов, например, Picasa или Adobe Lightroom.
Я выделил код для создания каталога и управления им
в отдельную библиотеку DLL, которую я сейчас хочу протестировать. Однако большинство моих классов никогда не предназначены для создания экземпляров самостоятельно. Вместо этого все происходит через мой класс Каталог
. Например, я не могу протестировать свой класс File
самостоятельно, поскольку файл
доступен только через каталог
.
В качестве альтернативы модульным тестам, я думаю, для меня было бы более разумным написать тестовую программу, которая запускала бы серию действий, включая создание каталога, повторное открытие созданного каталога и манипулирование содержимым каталог. См. Код ниже.
//NOTE: The real version would have code to log the results and any exceptions thrown
//input data
string testCatalogALocation = "C:\TestCatalogA"
string testCatalogBLocation = "C:\TestCatalogB"
string testFileLocation = "C:\testfile.jpg"
string testFileName = System.IO.Path.GetFileName(testFileLocation);
//Test creating catalogs
Catalog catAtemp = Catalog(testCatalogALocation)
Catalog catBtemp = Catalog(testCatalogBLocation );
//test opening catalogs
Catalog catA = Catalog.OpenCatalog(testCatalogALocation);
Catalog catB = Catalog.OpenCatalog(testCatalogBLocation );
using(FileStream fs = new FileStream(testFileLocation )
{
//test importing a file
catA.ImportFile(testFileName,fs);
}
//test retrieving a file
File testFile = catA.GetFile(System.IO.Path.GetFileName(testFileLocation));
//test copying between catalogs
catB.CopyFileTo(testFile);
//Clean Up after test
System.IO.Directory.Delete(testCatalogALocation);
System.IO.Directory.Delete(testCatalogBLocation);
Во-первых, я что-то упустил? Есть ли способ провести модульное тестирование такой программы? Во-вторых, есть ли способ создать тест процедурного типа, как в приведенном выше коде, но иметь возможность использовать инструменты тестирования, встроенные в Visual Studio? Позволит ли мне это сделать «Общий тест» в VS2010?
Обновление
Всем спасибо за ответы. На самом деле мои классы действительно наследуют от ряда интерфейсов. Вот диаграмма классов для всех, кому интересно. На самом деле интерфейсов у меня больше, чем классов. Я просто исключил интерфейсы из моего примера для простоты.
Спасибо за все предложения по использованию mocking. Я слышал этот термин в прошлом, но до сих пор не понимал, что такое «насмешка». Я понимаю, как я могу создать имитацию моего интерфейса IFile, который представляет собой один файл в каталоге. Я также понимаю, как создать фиктивную версию своего интерфейса ICatalog, чтобы проверить, как взаимодействуют два каталога.
Однако я не понимаю, как я могу протестировать свои конкретные реализации ICatalog, поскольку они сильно связаны со своими внутренними источниками данных. На самом деле вся цель моих классов Каталога - читать, писать и управлять их внешними данными / ресурсами.