我试图模拟以下存储库方法
IEnumerable<T> All(Expression<Func<T, bool>> criteria)
下面的模拟设置工作正常
repository.Setup(repo => repo.All(It.IsAny<Expression<Func<UserLog, bool>>>())).Returns(userLogs);
但是,当我想使用特定表达式进行设置时,它不起作用。当被叫,方法&#34;全部&#34;不会按指定的方式返回userlogs对象。
repository.Setup(repo => repo.All(v=>v.UserId==userId)).Returns(userLogs);
我也尝试了以下方法。我知道它的丑陋,但我很好奇它是否会起作用,而且确实如此。
repository.Setup(ulr =>
ulr.All(It.Is<Expression<Func<UserLog, bool>>>(e =>
e.Compile().Invoke(new UserLog { UserId = userId }))))
.Returns(userLogs);
然而,奇怪的是,将这个繁琐的表达式移动到一个单独的变量中并将其传入,却无效。如下所示
var itis = It.Is<Expression<Func<UserLog, bool>>>(e => e.Compile().Invoke(new UserLog { UserId = userId }));
repository.Setup(ulr => ulr.All(itis)).Returns(userLogs);
模拟方法的调用如下;
repository.All(u=>u.UserId==userId);
我想要做的是模拟特定表达式&gt;的方法。
我无法解决这个问题,希望得到一些帮助。
感谢。
答案 0 :(得分:0)
从模拟中检索传递的表达式,并使用linq
将其应用于伪结果repository
.Setup(_ => _.All(It.IsAny<Expression<Func<UserLog, bool>>>()))
.Returns((Expression<Func<UserLog, bool>> arg) => userLogs.Where(arg.Compile()));
当使用类似的东西调用模拟成员时,例如
var repo = repository.Object;
var result = repo.All(user => user.UserId == userId);
传递给repo的user => user.UserId == userId
表达式将在模拟设置中调用,假设userLogs
的类型为IEnumerable<UserLog>