Я бы начал с обдумывания сценариев для каждого шага вашей программы, начиная со сбоев и их ожидаемого поведения:
Пользователь указывает нулевое местоположение файла 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");
}