使用Moq的lambda表达式的存根上的参数计数不匹配

时间:2014-01-31 14:35:09

标签: unit-testing lambda moq

当我想测试我的租户存储库时,我得到'参数计数不匹配'TargetParameterCountException:

界面:

public interface ITenantRepository
{
    IQueryable<Tenant> Get(Expression<Func<Tenant, bool>> filter = null,
    Func<IQueryable<Tenant>, IOrderedQueryable<Tenant>> orderBy = null,
    string includeProperties = null);
}

测试代码:

var TenantRepository = new Mock<ITenantRepository>();

TenantRepository
    .Setup(p => p.Get(It.IsAny<Expression<Func<Tenant, bool>>>(),
        It.IsAny<Func<IQueryable<Tenant>,IOrderedQueryable<Tenant>>>() ,
        It.IsAny<string>()))
    .Returns(new Func<Expression<Func<Tenant, bool>>,
       IQueryable<Tenant>>(expr => Tenants.Where(expr.Compile()).AsQueryable()));

Tenant TestTenant = TenantRepository.Object.Get(
      t => t.TenantID == Tenant2.TenantID,
      null,
      null).FirstOrDefault();

错误发生在最后一行。

2 个答案:

答案 0 :(得分:2)

找到正确参数的解决方案:

TenantRepository.Setup(p => p.Get(It.IsAny<Expression<Func<Tenant, bool>>>(),
                                  It.IsAny<Func<IQueryable<Tenant>, IOrderedQueryable<Tenant>>>(),
                                  It.IsAny<string>()))
                .Returns(
                         (Expression<Func<Tenant, bool>> expr, 
                          Func<IQueryable<Tenant>, IOrderedQueryable<Tenant>> orderBy,
                          string includeProperties) => Tenants.Where(expr.Compile()).AsQueryable());

答案 1 :(得分:0)

我认为问题在于模拟对象的返回类型:根据您的界面,方法Get应返回IQueryable,但您正在嘲笑它返回Func<Expression<Func<Tenant, bool>>, IQueryable<Tenant>>。< / p>

请记住,返回一个函数与返回其结果不同;在这种情况下,您应该创建一个预期的IQueryable对象,然后告诉Moq返回它。使用其预期行为来模拟某些东西没有多大意义 - 这看起来就像你在这里尝试做的那样。