Страницы

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

вторник, 31 декабря 2019 г.

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

#c_sharp #aspnet_mvc #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()});
     // какая то логика тестирования
} 


Но тогда возникает вопрос - а какой у этого всего смысл? Ведь в моке мы подставляем
фейковые данные. То есть я вроде кк хочу протестировать работу моего репозитория а
вместо этого методы самого репозитория не используются, а вместо них используются подставные
данные из мока. 

Отсюда вопрос: как все же правильно будет тестировать репозиторий и в чем смысл найденного
мной примера? 
    


Ответы

Ответ 1



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

Ответ 2



Тесты делятся на две основные категорий: Автоматизированые - это тесты, которые ни от чего не зависят, они пишутся и выполняются быстрее. Интеграционные - это тесты, которые зависят от внешний среды (БД, Файловая система, Сеть). Для того, чтобы протестировать класс Repository, вам нужно создать заглушку для DbContext, который используется внутри класс Repository.

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

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