c# - C# 单元测试模拟 DbSet 错误,IQueryable 未实现 IAsyncEnumerable
问题描述
我有下面的测试,并在 DbSet/Context 上使用标准模拟。测试运行时失败,因为它指出“源 IQueryable 未实现 IAsyncEnumerable Team。只有实现 IAsyncEnumerable 的源才能用于实体框架异步操作”。
public async Task Get_team_name_with_valid_search_term_returns_team_names()
{
// Arrange
var data = new List<Team>
{
new Team {Name = "Leeds"},
new Team {Name = "Glasgow"}
}.AsQueryable();
var mockSet = new Mock<DbSet<Team>>();
mockSet.As<IQueryable<Team>>().Setup(m => m.Provider).Returns(data.Provider);
mockSet.As<IQueryable<Team>>().Setup(m => m.Expression).Returns(data.Expression);
mockSet.As<IQueryable<Team>>().Setup(m => m.ElementType).Returns(data.ElementType);
mockSet.As<IQueryable<Team>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
var mockContext = new Mock<RadContext>();
mockContext.Setup(c => c.Team).Returns(mockSet.Object);
var service = new ITeamSearchService(mockContext.Object);
// Act
var result = await service.GetTeamName("Gla");
// Assert
}
服务本身很简单
public async Task<List<SearchTeamResponse>> GetTeamName(string searchTerm)
{
if (searchTerm == null)
{
throw new ArgumentNullException(nameof(searchTerm));
}
var query = await _radContext.Team.Where(x => x.Name.StartsWith(searchTerm))
.OrderBy(x => x.Name)
.ToListAsync();
var json = JsonConvert.SerializeObject(query);
var result = JsonConvert.DeserializeObject<List<SearchTeamResponse>>(json);
return result;
}
解决方案
推荐阅读
- php - 使用未定义的常量接触 - 假定“接触”错误
- python - 在 Odoo 12 中未运行(加载)单元测试
- laravel - Laravel Eloquent:orderBy 相关表
- python - 无法通过其 ID 从 Google Drive 下载文件
- machine-learning - 在训练数据上拟合模型时没有错误,但在预测测试集时出现 NotFittedError
- c - 我无法理解 printf 的递归行为
- c# - 设计问题 - 具有相同功能的多个类
- bash - 使用 bash (awk/sed) 在第 28 列中没有数据时删除行
- firebase - 在从 firebase 获取的数据中的字符串中插入新行
- html - 反应式表单的动态表单问题