Moq通用存储库 - TARGETPARAMETERCOUNTEXCEPTION

时间:2013-07-03 10:32:49

标签: c# include mocking repository moq

我正在模拟一个通用存储库,并且刚刚为我的Retrieve方法添加了第二个参数,允许我为对象属性传递包含字符串,我有点困惑如何模拟这个并得到TargetParameterCountException

如果有人能够朝着正确的方向推动我,那就太棒了。

接口:

IQueryable<T> Retrieve(Expression<Func<T, bool>> predicate);

IQueryable<T> Retrieve(Expression<Func<T, bool>> predicate, IEnumerable<string> includes);

起订量:

var mActionRepository = new Mock<IRepository<ContainerAction>>();
mActionRepository.Setup(m => m.Retrieve(It.IsAny<Expression<Func<ContainerAction, bool>>>()))
    .Returns<Expression<Func<ContainerAction, bool>>>(queryable.Where);

mActionRepository.Setup(m => m.Retrieve(It.IsAny<Expression<Func<ContainerAction, bool>>>(), It.IsAny<IEnumerable<string>>()))
    .Returns<Expression<Func<ContainerAction, bool>>>(queryable.Where);

第一个Moq工作,第二个不工作。

1 个答案:

答案 0 :(得分:1)

Returns方法中,您需要将模拟方法的所有参数类型指定为泛型参数。

因此,您在第二次IEnumerable<string>来电中错过了Returns,这就是您获得TargetParameterCountException的原因。

所以你的第二个Returns应该是这样的:

mActionRepository.Setup(m => m.Retrieve(
    It.IsAny<Expression<Func<ContainerAction, bool>>>(), 
    It.IsAny<IEnumerable<string>>()))
    .Returns<Expression<Func<ContainerAction, bool>>, IEnumerable<string>>(
        (predicate, includes) => queryable.Where(predicate));