Скажем, у вас есть этот метод для извлечения всех имен людей из файла:
string[] GetNamesFrom(string path) { }
Чтобы протестировать этот метод, вам потребуется указать путь к существующему файлу, который требует некоторой настройки.
Сравните это с этим методом:
string[] GetNamesFrom(IFile file)
Если IFile
содержит метод GetContents()
, то ваша «реальная» реализация этого интерфейса может получить доступ к файловой системе, а ваш фиктивный класс может просто вернуть ваши тестовые входные данные.
Использование фиктивной библиотеки, такой как moq (http://code.google.com/p/moq/)), это становится действительно простым:
var fileMock = new Mock<IFile>();
fileMock.Setup(f => f.GetContents()).Returns(testFileContents));
Assert.Equals(expectedNameArray, GetNamesFrom(fileMock.Object));
Запись файла в файловую систему перед тестированием может показаться не слишком сложной настройкой, но если вы выполняете много тестов, это превращается в беспорядок. Используя интерфейсы и макеты, все настройки выполняются в рамках вашего метода тестирования.