Ответ 1
Я начал бы думать о сценариях для каждого шага вашей программы, начиная с случаев отказа и ожидаемого поведения:
-
Пользователь предоставляет нулевое местоположение файла csv (выбрасывает
ArgumentNullException
). -
Пользователь предоставляет пустое место в каталоге csv (выбрасывает
ArgumentException
). -
Файл csv, указанный пользователем, не существует (что бы вы ни считали подходящим).
Затем напишите тест для каждого из этих сценариев и убедитесь, что он не работает. Затем напишите достаточно кода, чтобы пройти тест. Это довольно легко для некоторых из этих условий, потому что код, который делает ваш тестовый проход, часто является окончательным кодом:
public class Merger {
public void Merge(string csvPath, string templatePath, string outputPath) {
if (csvPath == null) { throw new ArgumentNullException("csvPath"); }
}
}
После этого перейдите в стандартные сценарии:
-
Указанный файл csv имеет одну строку (объединение должно быть вызвано один раз, вывод написан в ожидаемое место).
-
Указанный файл csv имеет две строки (слияние должно вызываться дважды, вывод записывается в ожидаемое местоположение).
-
Имя выходного файла соответствует вашим ожиданиям (независимо от того, что есть).
И так далее. Как только вы перейдете на этот второй этап, вы начнете определять поведение, которое вы хотите заглушить и издеваться. Например, проверяя, существует ли файл или нет -.NET не упрощает его заглушку, поэтому вам, вероятно, потребуется создать интерфейс и класс адаптера, которые позволят вам изолировать вашу программу от фактической файловой системы (до не говоря уже о фактических файлах CSV и шаблонах слияния почты). Существуют и другие методы, но этот метод довольно стандартный:
public interface IFileFinder { bool FileExists(string path); }
// Concrete implementation to use in production
public class FileFinder: IFileFinder {
public bool FileExists(string path) { return File.Exists(path); }
}
public class Merger {
IFileFinder finder;
public Merger(IFileFinder finder) { this.finder = finder; }
}
В тестах вы пройдете реализацию заглушки:
[Test]
[ExpectedException(typeof(FileNotFoundException))]
public void Fails_When_Csv_File_Does_Not_Exist() {
IFileFinder finder = mockery.NewMock<IFileFinder>();
Merger merger = new Merger(finder);
Stub.On(finder).Method("FileExists").Will(Return.Value(false));
merger.Merge("csvPath", "templatePath", "outputPath");
}