[英].Net Core Unit Test Error - The source IQueryable doesn't implement 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.