Изолирую зависимости от реальной БД при написании модульных тестов в проекте. Интерфейс репозитория имеет следующий вид:
public interface IRepository
{
T Find
В реальном контексте метод реализован следующим образом:
public ConcreteDBContext : DBContext, IRepository
{
//some code
public T Find
Вопрос: как правильно реализовать такой метод в FakeDBContext? И от чего наследовать сам контекст, кроме самого интерфейса IRepository?
Ответ
Если в местах, где вы используете db context, зависимость имеет тип IRepository, то вам достаточно наследовать заглушку от этого интерфейса (для этого зависимости и интерфейсы и нужны :)). Как правило, для каждого теста вам нужна будет своя реализация метода Find
Самый правильный способ работать с моками -- использовать мок-фреймворки. Их великое множество: Moq, RhinoMock, NSubstitute и проч. Синтаксис их будет немного отличаться, однако суть работы с моками всегда одна:
Создаем мок-объект.
Устанавливаем, что должен возвращать нужный нам метод мок-объекта
при вызове с такими-то параметрами.
Проверяем, что нужный нам метод был вызван (опционально).
Например, с использованием NSubstite это будет выглядеть так:
var personId = 1;
var repo = Substitute.For
var someObjectThatUsesRepo = new SomeObjectThatUsesRepo(repo);
someObjectThatUsesRepo.SomeMethod();
// проверяем, что метод вызвался ровно один раз
repo.Received(1).Find
Комментариев нет:
Отправить комментарий