gpt4 book ai didi

c# - 带过滤器的模拟依赖注入(inject)存储库

转载 作者:行者123 更新时间:2023-11-30 20:55:03 25 4
gpt4 key购买 nike

尝试模拟存储库:

 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);

我得到一个异常(exception):

System.ArgumentException : Object of type 'System.Linq.Expressions.Expression1[System.Func2[Entity,System.Boolean]]' cannot be converted to type '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());

但因此您不需要方法参数来提供返回结果,使用上面的代码。

关于c# - 带过滤器的模拟依赖注入(inject)存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18587408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com