Страницы

Поиск по вопросам

среда, 19 декабря 2018 г.

Entity Framework и юнит тесты

Доброго времени суток!
У меня есть такой вопрос: у меня есть веб-прриложение asp.net mvc которое работает с базой данных через Entity Framework.
Для работы с Entity я создал класс-провайдер выполняющий стандартные CRUD операции. Хотелось бы все это дело покрыть юнит тестами как у крутых мужиков. Но слышал что юнит тесты не должны работать с базой данных. И это вроде как логично - допустим я хочу потестировать операции вставки, обновления и удаления у своего репозитория но будет странно если тестовый код будет осуществлять эти операции с реальной базой (пусть даже и тестовой).
Пример теста с использованием Moq найденный на просторах интернета
// интерфейс репозитория interface IRepository : IDisposable { List GetComputerList(); Computer GetComputer(int id); void Create(Computer item); void Update(Computer item); void Delete(int id); }
// тестовый метод [TestMethod] public void IndexViewBagMessage() { var mock = new Mock(); mock.Setup(a => a.GetComputerList()).Returns(new List() { new Computer()}); // какая то логика тестирования }
Но тогда возникает вопрос - а какой у этого всего смысл? Ведь в моке мы подставляем фейковые данные. То есть я вроде кк хочу протестировать работу моего репозитория а вместо этого методы самого репозитория не используются, а вместо них используются подставные данные из мока.
Отсюда вопрос: как все же правильно будет тестировать репозиторий и в чем смысл найденного мной примера?


Ответ

Смысл вашего примера — тестирование работы куска кода, который работает с репозиторием. Для него репозиторий подменяется на фейк.
Для тестирования самого репозитория вам нужно фейкнуть то, с чем он работает — то есть, базу данных. Тестируйте настоящий репозиторий на тестовой базе данных, ничего плохого в этом не вижу.
В любом случае, для «вертикальной» структуры приложения, если вы тестируете уровень X, вы в тестах подставляете фейковые нижележащие структуры данных/объекты (которые эмулируют уровень X + 1), а вышележащие объекты (то есть, те, которые работают с вашим уровнем X), заменяются на код теста.

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

Отправить комментарий