【问题标题】:Mocking LINQ Expressions - Moq模拟 LINQ 表达式 - Moq
【发布时间】:2013-09-10 15:30:51
【问题描述】:

如何使用 Moq 模拟 - Expression> 的内容?

我正在尝试模拟对我的 repo 层的调用,该调用采用 LINQ 表达式来构造查询。我正在尝试以下语法,但失败了。 SearchFor 方法没有被调用。

var array = new Employee[1];

array[0] = new Employee() { ID = 1234, Name = "Test" };

MockEmployeeRepo.Setup(x => x.SearchFor(It.IsAny<Expression<Func<Employee, bool>>>()))
            .Returns(array.AsQueryable);

var list = EmployeeService.GetEmployees("Test");

MockEmployeeRepo.Verify(x => x.SearchFor(x1 => x1.Name == "Test"), Times.Once());

Assert.AreEqual("Test", list[0].Name);

GetEmployees 方法如下所示。

public IEnumerable<Employee> GetEmployees(string name)
{
    return repo.SearchFor(x => x.Name == name);
}

【问题讨论】:

  • 据我所知,您无法验证表达式,SearchFor 参数采用什么?是表达式吗?
  • 正确。它采取了一种表达方式。关于我将如何进行单元测试的任何想法?
  • 你真的需要它作为一个表达式吗?为什么不能只传入字符串而不是表达式?
  • 因为我相信,SearchFor 应该只是将它委托给存储库,它最终会出现在 DbSet 中,您可以验证给定名称,它返回了正确的结果。在这个级别,我相信您可以验证它是否调用了它。
  • 我可以这样做,但我试图使我的存储库上的 SearchFor 方法非常通用,以便它可以作用于任何实体。有意义吗?

标签: c# mocking expression moq moq-3


【解决方案1】:

Moq 不支持 Expression 功能,所以这里是最好的解决方案。使用这个 nuget 包Moq.Expression

// import namespace
using MoqExpression;

// it will work
MockEmployeeRepo.Setup(x => x.SearchFor(MoqHelper.IsExpression<Employee>(s => s.Name.Equals("Test")))).Returns(array.AsQueryable);

更多文档:https://github.com/ovaishanif94/Moq.Expression

【讨论】:

  • 截至 2019 年 10 月 10 日 Moq.Expression 仅适用于 .Net Core。如果有人知道 .Net 4.7(或任何非 .Net Core 版本)的解决方案,请回复。
  • @schwechel 您可以尝试如下。 .Setup(x => x.SearchFor(It.Is>>(e => e.Body.ToString().Contains("x.Name")))).ReturnsAsync( array.AsQueryable)
猜你喜欢
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多