具有表达式<func <t,bool>&gt;的方法的Moq设置争论

时间:2018-02-23 13:06:06

标签: c# unit-testing moq

我试图模拟以下存储库方法

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;的方法。

我无法解决这个问题,希望得到一些帮助。

感谢。

1 个答案:

答案 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>