2

试图模拟存储库:

 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.Func2[Entity,System.Boolean]]”类型的对象无法转换为“System.Linq.IQueryable`1[Entity]”类型。

4

2 回答 2

3

只需返回您希望模拟方法返回的值。在您的情况下,它将是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());

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

于 2013-09-03T08:39:55.147 回答
1

您的Returns()语句绑定您FuncGetMany()被调用时返回,而不是评估表达式并返回结果。如果你把它拿出来,它应该可以工作r=>。如果没有类型参数,您也可以逃脱。

于 2013-09-03T08:40:06.577 回答