Модельные юнит-тесты для операторов Linq в. Net core 2.2 всегда возвращают ноль - PullRequest
2 голосов
/ 23 января 2020

Я знаю, что задают много насмешливых вопросов, но ни один из них не работает со мной.

Я пытаюсь написать модульный тест для моей службы. Служба имеет следующую строку кода

    var assignments = await _assignmentRepository.WhereAsync(as => as.DepartmentId == departmentId);

Вот реализация метода WhereAsync:

    public async Task<List<T>> WhereAsync(Expression<Func<T, bool>> expression)
    {
        return await _dbContext.Set<T>().Where(expression).ToListAsync();
    }

Вот мой ложный тестовый оператор (listAssignments - предопределенная переменная):

     _assignmentRepository.Setup(rep => rep.WhereAsync(as => It.IsAny<bool>())).ReturnsAsync(listAssignments);

Я знаю, что мы не можем смоделировать Where и FirstOrDefault методы, но нет ли способа высмеять мой веб-сервис WhereAsync метод ??

1 Ответ

2 голосов
/ 27 февраля 2020

Как Tseng упомянуто в комментарии выше. Мы не дразним DbContext, мы дразним сам репозиторий.

Поэтому я использовал тест InMemoryDatabase. Добавил некоторые данные в мою базу данных в памяти, что заставило меня DbContext вернуть нужные мне данные.

        var mapOptions = new DbContextOptionsBuilder<MapViewerContext>()
               .UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString())
               .Options;
        var identityOptions = new DbContextOptionsBuilder<AppIdentityDbContext>()
            .UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString())
            .Options;
        var mapContext = new MapViewerContext(_configuration.Object, mapOptions);
        var appIdentityContext = new AppIdentityDbContext(_configuration.Object, identityOptions);
...