Чтобы ответить на ваш конкретный вопрос: Нет, нет библиотек, которые позволили бы вам имитировать файловые вызовы ввода / вывода (о которых я знаю). Это означает, что для «правильного» модульного тестирования ваших типов потребуется учитывать это ограничение при определении типов.
Краткое примечание о том, как определить «правильный» модульный тест. Я считаю, что модульные тесты должны подтвердить, что вы получите ожидаемый результат (будь то исключение, вызов метода и т. Д.) При условии известных входных данных. Это позволяет вам настроить условия вашего модульного теста как набор входов и / или входных состояний. Лучший способ сделать это - использовать основанные на интерфейсе сервисы и внедрение зависимостей, чтобы каждая ответственность, внешняя по отношению к типу, обеспечивалась через интерфейс, передаваемый через конструктор или свойство.
Итак, помня об этом, вернемся к вашему вопросу. Я смоделировал вызовы файловой системы, создав IFileSystemService
интерфейс вместе с FileSystemService
реализацией, которая представляет собой просто фасад методов файловой системы mscorlib. Мой код использует IFileSystemService
типы, а не mscorlib. Это позволяет мне подключить мой стандарт, FileSystemService
когда приложение работает, или смоделировать IFileSystemService
в моих модульных тестах. Код приложения один и тот же независимо от того, как он выполняется, но базовая инфраструктура позволяет легко тестировать этот код.
Я признаю, что использовать оболочку вокруг объектов файловой системы mscorlib очень сложно, но в этих конкретных сценариях стоит дополнительной работы, поскольку тестирование становится намного проще и надежнее.