#c_sharp #aspnet_mvc #entity_framework #юнит_тесты
Доброго времени суток! У меня есть такой вопрос: у меня есть веб-прриложение asp.net mvc которое работает с базой данных через Entity Framework. Для работы с Entity я создал класс-провайдер выполняющий стандартные CRUD операции. Хотелось бы все это дело покрыть юнит тестами как у крутых мужиков. Но слышал что юнит тесты не должны работать с базой данных. И это вроде как логично - допустим я хочу потестировать операции вставки, обновления и удаления у своего репозитория но будет странно если тестовый код будет осуществлять эти операции с реальной базой (пусть даже и тестовой). Пример теста с использованием Moq найденный на просторах интернета // интерфейс репозитория interface IRepository : IDisposable { ListGetComputerList(); 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()}); // какая то логика тестирования } Но тогда возникает вопрос - а какой у этого всего смысл? Ведь в моке мы подставляем фейковые данные. То есть я вроде кк хочу протестировать работу моего репозитория а вместо этого методы самого репозитория не используются, а вместо них используются подставные данные из мока. Отсюда вопрос: как все же правильно будет тестировать репозиторий и в чем смысл найденного мной примера?
Ответы
Ответ 1
Смысл вашего примера — тестирование работы куска кода, который работает с репозиторием. Для него репозиторий подменяется на фейк. Для тестирования самого репозитория вам нужно фейкнуть то, с чем он работает — то есть, базу данных. Тестируйте настоящий репозиторий на тестовой базе данных, ничего плохого в этом не вижу. В любом случае, для «вертикальной» структуры приложения, если вы тестируете уровень X, вы в тестах подставляете фейковые нижележащие структуры данных/объекты (которые эмулируют уровень X + 1), а вышележащие объекты (то есть, те, которые работают с вашим уровнем X), заменяются на код теста.Ответ 2
Тесты делятся на две основные категорий: Автоматизированые - это тесты, которые ни от чего не зависят, они пишутся и выполняются быстрее. Интеграционные - это тесты, которые зависят от внешний среды (БД, Файловая система, Сеть). Для того, чтобы протестировать класс Repository, вам нужно создать заглушку для DbContext, который используется внутри класс Repository.
Комментариев нет:
Отправить комментарий