Ложные выражения 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'")
Другие вопросы по тегам