模拟 LINQ 表达式 - 最小起订量

本文关键字:LINQ 表达式 模拟 | 更新日期: 2023-09-27 18:30:58

如何使用最小起订量模拟 - 表达式>

我正在尝试模拟对我的存储库层的调用,该层采用 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);
}

模拟 LINQ 表达式 - 最小起订量

Moq 不支持表达式功能,所以这是最好的解决方案。使用此 nuget 包 Moq.表达式

// 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

在某些情况下,

您可以将表达式计算为可比较的内容,例如string

It.Is<Expression<Func<Employee, bool>>>(expression => SomeEvaluator.Evaluate (expression) == "Name = 'Test'");

就我而言,我想模拟对 Azure 表的查询,所以我使用 Azure.Data.Tables.TableClient.CreateQueryFilter 进行评估,即:

It.Is<Expression<Func<TableEntity, bool>>> (query => TableClient.CreateQueryFilter (query) == "RowKey eq 'someId'")