MSTest v2 и исходный код IQueryable не реализуют IAsyncEnumerable с Entity Framework Core - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь создать модульные тесты (MSTest v2) для библиотеки DAL (ядро EF)

DataService

    public IQueryable<BalanceDTO> GetCollection()
    {
        var entities = dbContext.Balance;
        var dtos = mapper.Map<ICollection<BalanceDTO>>(entities).ToList();
        dtos.ForEach(_d =>
        {
            _d.MonthSort = _d.Date.Month;
            _d.MonthName = (new DateTimeFormatInfo()).GetMonthName(_d.MonthSort);
        });
        return dtos.AsQueryable();
    }

    public async Task<IList<BalanceDTO>> GetBalancesByYear(int year)
    {
        return await GetCollection().Where(_d => _d.Date.Year == year).OrderBy(_d => _d.MonthSort).ToListAsync();
    }

Test

    [TestMethod()]
    [DataTestMethod]
    [DataRow(2020, 2019)]
    public void GetBalancesByYearTest(int found, int notfound)
    {
        var _configuration = new ConfigurationBuilder()
            .SetBasePath(AssemblyProperties.AssemblyDirectory)
            .AddJsonFile("appsettings.json")
            .Build();
        var optionsBuilder = new DbContextOptionsBuilder<AccountManagerContext>();
        optionsBuilder.UseSqlServer(_configuration.GetConnectionString("AccountManagerLocalDB"));

        var balanceDataService = new BalanceDataService(optionsBuilder);
        var elementsFound = balanceDataService.GetBalancesByYear(found);
        var elementsNotFound = balanceDataService.GetBalancesByYear(notfound);

        Assert.IsNotNull(balanceDataService);
        Assert.IsTrue(elementsFound.Result.Count > 0);
        Assert.IsTrue(elementsNotFound.Result.Count == 0);
    }

Но я получаю эту ошибку:

InvalidOperationException: The source IQueryable doesn't implement IAsyncEnumerable<AccountManager.DAL.DTO.BalanceDTO>. 
Only sources that implement IAsyncEnumerable can be used for Entity Framework asynchronous operations.

Я нашел пару ссылок, но не смог выяснить, как решить эту проблему.

ToArrayAsyn c () выдает «Исходный IQueryable не реализует IAsyncEnumerable»

Как преодолеть IQueryable не реализует IAsyncQueryProvider во время Mocking из * Sql () method?

Есть идеи о том, как создавать тесты для моих методов DataService?

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Я закончил с этим решением. Если кто-то видит ошибку или что-то, что нужно улучшить, я буду признателен за любые рекомендации.

    public IQueryable<BalanceDTO> GetCollection()
    {
        var entities = dbContext.Balance;
        var dtos = mapper.Map<ICollection<BalanceDTO>>(entities);
        foreach(var _d in dtos)
        {
            _d.MonthSort = _d.Date.Month;
            _d.MonthName = (new DateTimeFormatInfo()).GetMonthName(_d.MonthSort);
        };
        return dtos.AsQueryable();
    }

    public async Task<IList<BalanceDTO>> GetBalancesByYear(int year)
    {
        var entities = dbContext.Balance.Where(_d => _d.Date.Year == year).OrderBy(_d => _d.Date);
        var balanceDTOs = Task<IList<BalanceDTO>>.Factory.StartNew(() =>
        {
            var dtos = mapper.Map<IList<BalanceDTO>>(entities);

            foreach (var _d in dtos)
            {
                _d.MonthSort = _d.Date.Month;
                _d.MonthName = (new DateTimeFormatInfo()).GetMonthName(_d.MonthSort);
            };
            return dtos;
        });

        return await balanceDTOs;
    }

Я изменил GetBalancesByYear, поэтому он не использует GetCollection, так как он не будет быстродействующий, если ему нужно собрать полную коллекцию элементов и преобразовать их в DTO непосредственно перед фильтрацией того, что ему не нужно.

Я совершенно не понимаю, кто должен правильно создавать асинхронные c методы для моего DAL, когда они нужно вернуть DTO, а не только сущности.

0 голосов
/ 21 апреля 2020

Entity Framework работает с DbSet s, которые являются более чем запрашиваемыми.

Вы можете использовать провайдер In-Memory для своих тестов , или макетировать Dbset s .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...