繁体   English   中英

模拟表达参数到存储库方法

[英]Mock Expression Parameter to Repository Method

使用起订量。 我有一个具有以下接口的存储库:

public virtual IEnumerable<TEntity> GetBySpec(ISpecification<TEntity> specification, params string[] includes)
{
        IQueryable<TEntity> query = includes.Aggregate<string, IQueryable<TEntity>>(_dbSetQuery, (current, include) => current.Include(include));

        return query.Where(specification.SatisfiedBy())
                                 .AsEnumerable<TEntity>();
}

在这种情况下,我使用的是DirectSpecification:

public sealed class DirectSpecification<TEntity> : Specification<TEntity>
{
    Expression<Func<TEntity, bool>> _MatchingCriteria;

    public DirectSpecification(Expression<Func<TEntity, bool>> matchingCriteria)
    {
        _MatchingCriteria = matchingCriteria;
    }

    public override Expression<Func<TEntity, bool>> SatisfiedBy()
    {
        return _MatchingCriteria;
    }
}

用我的实际代码打电话

var recentlyChanged = _vwPersonRepository.GetBySpec(
               new DirectSpecification<vwPerson>(person =>
                   person.ModifiedDate > modifiedFromDay &&
                   person.ModifiedDate < modifiedTo));

var recentlyCreated = _vwPersonRepository.GetBySpec(
               new DirectSpecification<vwPerson>(person =>
                   person.CreatedDate > createdFromDay &&
                   person.CreatedDate < createdTo));

编辑:如重复所建议,我已经尝试过:

        Container.GetMock<IvwPersonRepository>()
            .Setup(p => p.GetBySpec(It.IsAny<ISpecification<vwPerson>>()))                        
            .Returns((Expression<Func<vwPerson, bool>> predicate) => 
              items.Where(predicate));

我得到一个

Exception thrown: 'System.Reflection.TargetParameterCountException' in mscorlib.dll

Additional information: Parameter count mismatch.

我的问题由于具有ISpecification参数而变得复杂,如何获得正确的参数以便可以使用谓词?

编辑2:感谢Patrick,这是解决方案:

        Container.GetMock<IvwPersonRepository>()
            .Setup(p => p.GetBySpec(It.IsAny<ISpecification<vwPerson>>(), It.IsAny<string[]>()))                        
            .Returns((ISpecification<vwPerson> specification, string[] includes) => 
              items.Where(predicate));

他们的关键是包括string[] includes ,即使我没有将其作为参数传递,反射也发现它并希望它在那里。

辉煌!

您的编辑中的Setup调用是错误的,应该是:

Container.GetMock<IvwPersonRepository>()
         .Setup(p => p.GetBySpec(It.IsAny<ISpecification<vwPerson>>()))
         .Returns((ISpecification<vwPerson> specification) => /* TODO */);

(这是因为传递给Returns的参数是传递给正在设置的函数的参数,在本例中为GetBySpec 。)

我相信(根据您发布的内容)您可以做到这一点:

Container.GetMock<IvwPersonRepository>()
         .Setup(p => p.GetBySpec(It.IsAny<ISpecification<vwPerson>>()))
         .Returns((ISpecification<vwPerson> specification) => items.Where(specification.SatisfiedBy()));

但是,使用工厂创建规范可能会带来一些好处,这样您就可以模拟它们以避免依赖于它们的实现(在上面对SatisfiedBy的调用中)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM