【问题标题】:Expression<Func<T, bool>> with It.IsAny always return true带有 It.IsAny 的 Expression<Func<T, bool>> 总是返回 true
【发布时间】:2012-11-16 22:26:37
【问题描述】:

我正在尝试创建一个通用测试类来测试我的通用控制器。一切正常,除了这个: 我有这样的方法:

private T GetSingle(Expression<Func<T, bool>> expression)

我正在尝试这样设置测试:

var Guids = new[] { Guid.NewGuid(), Guid.NewGuid() };
var items = Guids.Select(x => new T {Id = x});
var mock = new Mock<IRepository<T>>();
mock.Setup(m => m.GetSingle(
    It.IsAny<Expression<Func<T, bool>>>()))
   .Returns(new T());

然后像这样执行测试:

var value = Repository.GetSingle(x=> x.Id == Guid.NewGuid());

总是返回一个新的T。

我的设置错了吗?

【问题讨论】:

  • 你在测试什么?在我看来,您想模拟实际实现存储库查找逻辑。

标签: c# unit-testing generics moq expression-trees


【解决方案1】:

您指示 Moq 在任何时候调用 GetSingle 时返回完全相同的实例(在本例中为 new T()),而不管提供的表达式如何。您真正想要的是它针对items 调用该表达式:

mock.Setup(m => m.GetSingle(It.IsAny<Expression<Func<T, bool>>>()))
   .Returns<Expression<Func<T, bool>>>(expression => items.AsQueryable().Single(expression));

【讨论】:

  • 感谢被黑!我已经为此工作了一段时间,但无法使其正常工作。我对此很陌生,感谢您帮助我改进!
  • Single() 确实做到了它的意思,并且它有 an overload 正是采用该参数。它可能会更好,因为如果有多个匹配项,它会抛出。
  • 是的,我在谓词重载上的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多