加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 如何使用Moq模拟存储库Single(Expression> pr

发布时间:2020-12-16 09:59:38 所属栏目:asp.Net 来源:网络整理
导读:我正在玩.NET MVC,我正在编写一些单元测试.我有一个接口存储库,如下所示: public interface IRepositoryTEntity : IDisposable where TEntity : class{ IQueryableTEntity GetAll(); TEntity Single(ExpressionFuncTEntity,bool predicate);} 我像这样嘲笑
我正在玩.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>)’一些无效的论点.

这甚至是做到这一点的最佳方法,还是单一方法只返回一个新帖子而不考虑传入的表达式?

编辑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,Created = DateTime.Now }
                }.Single(expr.Compile()));

解决方法

我相信如果你需要使用参数,你可以在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,Created = DateTime.Now }    
    }.Where(expr.Compile()));

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读