带过滤器的模拟依赖注入存储库
本文关键字:注入 存储 依赖 模拟 过滤器 | 更新日期: 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=>
,它应该会起作用。您可能也可以不使用类型参数。