带过滤器的模拟依赖注入存储库

本文关键字:注入 存储 依赖 模拟 过滤器 | 更新日期: 2023-09-27 18:30:08

尝试模拟存储库:

 var expMock = new Mock<IEntityRepository>();
 expMock.Setup(s => s.GetMany(It.IsAny<Expression<Func<Entity, bool>>>()))
        .Returns<IQueryable<Entity>>(r => 
                               new List<Entity>{ new Entity() } }.AsQueryable());

但当我称之为:

IEnumerable<Entity> source = _entityRepository.GetMany(w => w.IsActive);

我得到一个例外:

System.ArgumentException:类型为的对象'System.Linq.Expressions.Expression 1[System.Func 2[实体,System.Boolean]]'无法转换为类型"System.Linq.IQueryable `1[Entity]"。

带过滤器的模拟依赖注入存储库

只需返回您希望模拟方法返回的值。在您的情况下,它将是IQueryable:

expMock.Setup(s => s.GetMany(It.IsAny<Expression<Func<Entity, bool>>>()))
       .Returns(new List<Entity>{ new Entity() }.AsQueryable());

Returns方法的泛型参数是被调用方法的参数类型。Returns<IQueryable<Entity>>意味着GetMany方法应该用类型为IQueryable<Entity>的参数调用,当然这不是真的。这就是为什么你会得到这个例外。

方法参数是表达式,因此正确的模拟设置应该如下所示:

.Returns<Expression<Func<Entity, bool>>>(e => 
      new List<Entity> { new Entity() }.AsQueryable());

但这样就不需要方法参数来提供返回的结果,请使用上面的代码。

您的Returns()语句正在绑定Func,以便在调用GetMany()时返回,而不是计算表达式并返回结果。如果你去掉r=>,它应该会起作用。您可能也可以不使用类型参数。