c# - 尝试模拟 IQueryable Entity Framework 查询

标签 c# entity-framework linq iqueryable

我正在尝试测试查询是否不区分大小写。此生产代码有效:

public ILookup<string, EEntry> GetEEntries(int batchId, List<string> employeeIds)
{
  using (WithNoLock())
  {
    var result = from e in _entities.EEntries
                 where e.CPayBatchProcessId == batchId
                       && (!e.Blocked.HasValue || e.Blocked.Value != true)
                       && employeeIds.Contains(e.Id)
                 select e;

    return result.ToLookup(e => e.Id, StringComparer.OrdinalIgnoreCase);
  }
}

我无法让单元测试工作。我的第一次尝试失败了,因为我认为该列表是 IEnumerable 而不是 IQueryable。但是,我对 IQueryable 的尝试没有通过。查询区分大小写,我不希望这样。这是我为使它成为 IQueryable 所做的:

[TestCase("abc", "ABC")]
public void EEntriesAreCaseInsensitive(string employeeId1Input, string employeeId1Output)
{
  var payEntries = new List<EEntry>
  {
    new EEntry() {CPayBatchProcessId = 8, Id = employeeId1Input},
    new EEntry() {CPayBatchProcessId = 8, Id = "123"}
  }.AsQueryable();

  var payEntriesDbSet = new Mock<DbSet<EEntry>>();
  payEntriesDbSet.As<IQueryable<EEntry>>().Setup(x => x.Provider).Returns(payEntries.Provider);
  payEntriesDbSet.As<IQueryable<EEntry>>().Setup(x => x.Expression).Returns(payEntries.Expression);
  payEntriesDbSet.As<IQueryable<EEntry>>().Setup(x => x.ElementType).Returns(payEntries.ElementType);
  payEntriesDbSet.As<IQueryable<EEntry>>().Setup(x => x.GetEnumerator()).Returns(payEntries.GetEnumerator);

  var context = new Mock<ISomeContext>();
  context.Setup(x => x.EEntries).Returns(payEntriesDbSet.Object);

  var employeeIds = new List<string>() { "aBc", "dEf", "gHi" };

  var repo = new EEntriesRepository(context.Object);
  var payEntryRecords = repo.GetEEntries(8, employeeIds);

  Assert.IsTrue(payEntryRecords.Contains(employeeId1Output));
}

我错过了什么?

注意:EEntry.Id 的 getter 返回 .ToUpper()。生产代码正确地忽略了这一点。测试代码没有。

最佳答案

看起来您并没有在任何地方使用 employeeId1Output,但您断言它应该在 payEntryRecords 中。根据您的代码,您似乎应该断言 employeeId1Input 是否在 payEntryRecords 中。您明确地将 employeeId1Input 添加到您的 payEntries 对象。

关于c# - 尝试模拟 IQueryable Entity Framework 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52766411/

相关文章:

c# - 无法解析作用域服务 DbContextOptions

c# - LINQ,SQLite,分组和计数

c# - 如何在不实例化对象的情况下定义属性以从中读取属性?

c# - 是否可以将 IQueryable<CatDTO> 映射到 IQueryable<CatEf>?

c# - Entity Framework 6.1 将 CommitFailureHandler 设置为事务处理程序导致 SQL Server 登录失败

c# - 无法比较类型为 'System.Collections.Generic.ICollection`的元素 1 只支持原始类型、枚举类型和实体类型

c# - 尝试 catch block 还是 bool 标志?

c# - 如何使用 LINQ 删除没有其子节点的 Xelement?

C# 字符串数组 orderBy 重音字符问题

database - Entity Framework 枚举仅作为 POCO