【问题标题】:MOQ - LINQ Predicates in Setup MethodMOQ - 设置方法中的 LINQ 谓词
【发布时间】:2011-10-13 16:52:54
【问题描述】:

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

bool isConditionMet = MyRepository.Any(x => x.Condition == true);

我正在尝试使用 MOQ 来模拟这个:

MyMockedRepository.Setup(x => x.Any(y => y.Condition == true)).Returns(true);

但是,当代码执行时,存储库调用总是返回 false。

有没有办法使用最小起订量来做到这一点?

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

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

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

【问题讨论】:

  • 您能否显示更多MyRepository 的代码是Any() Linq 扩展方法或MyRepository 的一部分?
  • 我从我的基础存储库中为每个请求添加了我的 Any 方法。模拟类是IMyRepository,在MyRepository 中实现。

标签: c# .net unit-testing moq predicate


【解决方案1】:

您需要使用It.IsIt.IsAnyIt.IsRegex 匹配调用参数。

例如,要为 any 谓词返回 true,您可以使用:

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

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

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

【讨论】:

  • 拜托,你能告诉我 resultFunc 的样子吗?
  • @badrslaoui:取决于您测试的内容/方式。例如,您可能知道您正在测试的方法将检查存储库是否包含任何值并简单地返回 true。或者,您可以使用普通的内存中泛型 List&lt;T&gt; 模拟 repo,这意味着您可以简单地将表达式参数传递给列表的 IQueryable.Any 并让它返回 truefalse。或者,由于 lambda 可以捕获外部变量,您还可以保留一个标志,指示您是否有任何数据,然后返回标志值。
猜你喜欢
  • 2016-12-15
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
相关资源
最近更新 更多