Юнит тесты Entity Framework

181
30 января 2020, 16:00

Хочу протестировать сервисы работы с БД через EF.

Тестовый метод:

RoleService service = new RoleService(new RoleRepository());

[TestMethod]
public void TestGetAllAsync()
{
   IEnumerable<Role> roles = service.GetAll();
   Assert.IsNotNull(roles);
}

Метод сервиса

public IEnumerable<Role> GetAll()
{
    return _db.Roles.ToArray();
}

при отладке теста получаю ошибку

Message: Метод теста UnitTestTMSMVC.RolesServiceTest.TestGetAllAsync создал исключение: System.InvalidOperationException: The model backing the 'DataContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269)..

Т.е. требует наличия EF в проекте теста. Я поставил его, он потребовал контекст и классы моделей. Я перетянул, дальше он потребовал обновить БД, что не вариант (как и предыдущие действия).

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

Сделал поместил тесты в рабочем проекте, проблема ушла. Спасибо ответившим!

Answer 1

Тесты на настоящей БД - это уже не юнит-тесты, а интеграционные (тестируем весь DAL, включая миграции, а не отдельные изолированные типы).

Тут есть два пути:

  1. использовать EF Core (который поддерживает .NET Standard 2.0), тогда будет возможно использовать InMemory Database-провайдер.
  2. Делать абстракцию над DbContext, скармливая репозиториям вместо него правильно заточенные Mock'и.
  3. Не тестить DAL вообще, делать его максимально тонким, вынося логику в сервисный слой
READ ALSO
Возврат значения из колбека c#

Возврат значения из колбека c#

Есть у меня некоторый метод:

184
Как выполнить выборку работы с БД

Как выполнить выборку работы с БД

Подскажите плизГде прочитать или кто то уже сталкивался

195
WPF. Работа MessageBox или проблема с потоками

WPF. Работа MessageBox или проблема с потоками

Имеется приложение WPF, в котором мне нужно открыть портВ случае, если порт открыть не удается - вывести сообщение об ошибке и после закрытия...

210
отличие array_splice от array_slice

отличие array_splice от array_slice

Вот срабатывает как надо:

201