Как создать репозиторий на основе XML и тестируемый репозиторий?

#c# #unit-testing #file-io

#c# #модульное тестирование #file-io

Вопрос:

Я пишу репозиторий на основе XML. На данный момент это единый класс с базовыми операциями CRUD. Один из параметров, передаваемых в конструкторе, относится url к файлу, в котором будет храниться репозиторий.

общедоступный репозиторий (string fileURL, схема IRepositorySchema)

Теперь я хотел бы написать модульные тесты для этого класса. Я не хочу использовать реальные файлы. Я провел некоторое исследование и нашел библиотеку SystemWrapper, которая может помочь мне с этой задачей.

Реальный вопрос в том, как я могу изменить свой класс репозитория, чтобы я мог создавать файл-макет / заглушку? Должен ли я вводить файловую систему вместе с URL-адресом файла?

Комментарии:

1. Похоже, это правильный подход. У вас есть конкретные сомнения по этому поводу?

2. File класс статичен, так как я могу его внедрить? Я слышал, что есть способы сделать это.

3. Когда вы используете оболочку, вы не вызываете статические методы BCL. Весь смысл оболочки в том, чтобы не вызывать их. Вызов через интерфейс. Внедрите реализацию этого интерфейса и используйте этот объект.

4. Вау, я этого не понял. Я собираюсь попробовать с этим.

5. Должен ли я использовать IFileWrap или есть какой-либо другой более подходящий интерфейс для этой цели?

Ответ №1:

Определенно хорошее направление для создания макетов файлов для тестирования.

Используя SystemWrapper, вы больше не будете вызывать System.IO.File статические методы, но вместо этого вы передаете экземпляр файла в репозиторий as SystemInterface.IO.IFile и выполняете все вызовы через него, так же, как вы делаете со схемой репозитория:

 public Repository(SystemInterface.IO.IFile file, IRepositorySchema schema)
 

Затем для производства вы будете использовать SystemWrapper.IO.FileWrap instace, предоставляемый SystemWrapper, который реализован с использованием System.IO.File , а для тестирования вы предоставите свою собственную SystemInterface.IO.IFile реализацию, соответствующую вашим потребностям в тестировании.

Ответ №2:

Я бы рекомендовал взглянуть на System.IO.Abstractions. Похоже, он находится в стадии более активной разработки.

Вы можете использовать тот же подход и с ним. Просто вводите конструктор IFileSystem . Затем в своих модульных тестах вы можете имитировать это с помощью библиотеки по вашему выбору или использовать удобные помощники по тестированию, которые поставляются вместе с библиотекой.