Ложные выражения LINQ - Moq
Как мне издеваться над чем-то - Expression> используя Moq?
Я пытаюсь смоделировать вызов для моего уровня репо, который принимает выражение 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);
}
2 ответа
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
В некоторых случаях вы можете преобразовать выражение в нечто сопоставимое, например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'")