Как я могу использовать модульное тестирование, когда классы зависят друг от друга или от внешних данных?

Я хотел бы начать использовать модульные тесты, но мне трудно понять, как я могу использовать их в моем текущем проекте.

Мой текущий проект - это приложение, которое собирает файлы в «Каталог». Каталог затем может извлекать информацию из файлов, которые он содержит, такую ​​как эскизы и другие свойства. Пользователи также могут помечать файлы другими настраиваемыми метаданными, такими как «Автор» и «Заметки». Его легко сравнить с приложением для создания фотоальбомов, например, 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, поскольку они сильно связаны со своими внутренними источниками данных. На самом деле вся цель моих классов Каталога - читать, писать и управлять их внешними данными / ресурсами.

5
задан Eric Anastas 8 September 2010 в 19:47
поделиться