如何使用Moq模拟存储库Single(表达式<func <tentity,bool =“”>&gt;谓词)方法</func <tentity,>

时间:2011-02-12 06:11:33

标签: asp.net-mvc moq

我正在玩.NET MVC,我正在编写一些单元测试。我有一个如下所示的接口存储库:

public interface IRepository<TEntity> : IDisposable where TEntity : class
{
    IQueryable<TEntity> GetAll();
    TEntity Single(Expression<Func<TEntity, bool>> predicate);
}

我像这样嘲笑了GetAll方法:

 _mockRepository.Setup(x => x.GetAll()).Returns(
            new List<Post>
                {
                    new Post { Title = "Test Post 1" }, 
                    new Post { Title = "Test Post 2" }
                }.AsQueryable());

现在我不确定如何模拟Single方法,因为它有一个包含我想要评估的表达式的参数。

谢谢,

B3N

编辑:

我将代码更改为:

_mockRepository.Setup(x => x.Single(It.IsAny<Expression<Func<Post, bool>>>()))
       .Returns( (Expression<Func<Post, bool>> expr) => new List<Post> { 
        new Post { PostId = 1, Title = "Test Post 1", Created = DateTime.Now }, 
        new Post { PostId = 2, Title = "Test Post 2", Created = DateTime.Now }    
        }.Where(expr));

但我现在收到以下错误:

'System.Collections.Generic.List'不包含'Where'的定义和最佳扩展方法重载'System.Linq.Queryable.Where(System.Linq.IQueryable,System.Linq.Expressions.Expression&gt; )'有一些无效的论点。

这是否是执行此操作的最佳方法,还是单一方法只返回新帖子而不考虑传入的表达式?

编辑2:

这是工作结果。

_mockRepository.Setup(x => x.Single(It.IsAny<Expression<Func<Post, bool>>>())).Returns(
            (Expression<Func<Post, bool>> expr) =>
            new List<Post>
                {
                    new Post { PostId = 1, Title = "Test Post 1", Created = DateTime.Now },
                    new Post { PostId = 2, Title = "Test Post 2", Created = DateTime.Now }
                }.Single(expr.Compile()));

1 个答案:

答案 0 :(得分:4)

我相信如果你需要使用参数,你可以在Returns方法中使用参数匹配器和lambda:

_mockRepository.Setup(x => x.Single(It.IsAny<Expression<Func<TEntity, bool>>>())
               .Returns((Expression<Func<TEntity, bool>> expr) => ... );

编辑: 您现在得到的错误是因为您尝试将表达式树传递给LINQ-To-Objects的Where方法。要解决此问题,请使用以下命令:

_mockRepository.Setup(x => x.Single(It.IsAny<Expression<Func<Post, bool>>>()))
   .Returns( (Expression<Func<Post, bool>> expr) => new List<Post> { 
    new Post { PostId = 1, Title = "Test Post 1", Created = DateTime.Now }, 
    new Post { PostId = 2, Title = "Test Post 2", Created = DateTime.Now }    
    }.Where(expr.Compile()));

Compile()会将表达式树转换为简单的Func委托。另外,由于mocked方法返回单个对象,因此Where()也不起作用。