簡體   English   中英

MSTest v2 和源 IQueryable 未使用 Entity Framework Core 實現 IAsyncEnumerable

[英]MSTest v2 and The source IQueryable doesn't implement IAsyncEnumerable with Entity Framework Core

我正在嘗試為 DAL 庫(EF 核心)創建單元測試(MSTest v2)

數據服務

    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();
    }

測試

    [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.

我找到了幾個鏈接,但不知道如何解決這個問題。

ToArrayAsync() 拋出“源 IQueryable 未實現 IAsyncEnumerable”

如何克服 IQueryable 不實現 IAsyncQueryProvider 而 Mocking FromSql() 方法?

關於如何為我的 DataService 方法創建測試的任何想法?

實體框架與DbSet一起工作,這不僅僅是可查詢的。

您可以使用 In-Memory 提供程序進行測試,或模擬Dbset

我最終得到了這個解決方案。 如果有人發現錯誤或需要改進的地方,我非常感謝任何建議。

    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,它就不會高效。

當他們需要返回 DTO 而不僅僅是實體時,我對誰為我的 DAL 正確創建異步方法感到很困惑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM