Мой подход к этому сильно смещен в Растущем объектно-ориентированном программном обеспечении, основанном на тестах (GOOS), которую я только что прочитал, но это лучшее, что я знаю сегодня. В частности:
- Создайте интерфейс для абстрагирования файловой системы от вашего кода. Макет, где этот класс нужен как соавтор / зависимость. Это позволяет быстро выполнять юнит-тесты и обратную связь.
- Создание интеграционных тестов, которые проверяют фактическую реализацию интерфейса. то есть убедитесь, что вызов Save () действительно сохраняет файл на диск и содержит содержимое записи (используйте справочный файл или проанализируйте его для нескольких вещей, которые он должен содержать)
- Создать приемочный тест, который тестирует всю систему - от начала до конца. Здесь вы можете просто проверить, что файл создан - цель этого теста - подтвердить, правильно ли подключена / подключена реальная реализация.
Обновление для комментатора:
Если вы читаете структурированные данные (например, объекты Book) (если не подставлять строку для IEnumerable)
interface BookRepository
{
IEnumerable<Books> LoadFrom(string filePath);
void SaveTo(string filePath, IEnumerable<Books> books);
}
Теперь вы можете использовать конструктор-инъекцию, чтобы внедрить макет в клиентский класс. Клиентский класс модульные тесты поэтому быстр; не попадать в файловую систему . Они просто проверяют, что на зависимостях вызываются правильные методы (например, Load / Save)
var testSubject = new Client(new Mock<BookRepository>.Object);
Далее необходимо создать реальную реализацию BookRepository, которая работает с файлом (или завтра с базой данных Sql, если вы этого хотите). Никто не должен знать.
Запишите интеграционные тесты для FileBasedBookRepository (который реализует указанную выше роль) и проверьте, что вызов Load with reference file дает нужные объекты и вызов Save с известным списком, сохраняет их на диск. Т.е. использует реальные файлы Эти тесты будут медленными, поэтому пометьте их тегом или переместите в отдельный набор.
[TestFixture]
[Category("Integration - Slow")]
public class FileBasedBookRepository
{
[Test]
public void CanLoadBooksFromFileOnDisk() {...}
[Test]
public void CanWriteBooksToFileOnDisk() {...}
}
Наконец, должен быть один / несколько приемочных тестов , в которых выполняется загрузка и сохранение.