MOQ - LINQ谓词设置方法

Bra*_*don 21 .net c# unit-testing predicate moq

在我的方法中,我有我的存储库这样做:

bool isConditionMet = MyRepository.Any(x => x.Condition == true);
Run Code Online (Sandbox Code Playgroud)

我试图使用MOQ来模拟这样:

MyMockedRepository.Setup(x => x.Any(y => y.Condition == true)).Returns(true);
Run Code Online (Sandbox Code Playgroud)

但是,当代码执行时,存储库调用始终返回false.

有没有办法用MOQ做到这一点?

**编辑 - 每个请求添加代码**

我正在使用NHibernate所以我的Any方法在我的基础存储库中并实现如下:

public virtual bool Any(Expression<Func<T, bool>> predicate)
{
    return Session.Query<T>().Cacheable().Any(predicate);
}
Run Code Online (Sandbox Code Playgroud)

Gro*_*roo 24

你需要使用匹配调用参数It.Is,It.IsAnyIt.IsRegex.

例如,返回true任何谓词,您可以使用:

MyMockedRepository
     .Setup(x => x.Any(It.IsAny<Expression<Func<T, bool>>>()))
     .Returns(true);
Run Code Online (Sandbox Code Playgroud)

或者,您可以匹配所有表达式,但传递一个委托,该委托将根据表达式本身返回一个值:

Func<Expression<Func<T, bool>, bool> resultFunc = { ... }
MyMockedRepository
     .Setup(x => x.Any(It.IsAny<Expression<Func<T, bool>>>()))
     .Returns(resultFunc);
Run Code Online (Sandbox Code Playgroud)