У меня есть реализация Unit of Work, среди прочего, следующий метод:
T Single<T>(Expression<Func<T, bool>> expression) where T : class, new();
и я называю это, например, следующим образом:
var person = _uow.Single<Person>(p => p.FirstName == "Sergi");
Как проверить, что метод Single
был вызван с аргументом FirstName == "Sergi"
?
Я пробовал следующее, но безрезультатно:
// direct approach
session.Verify(x => x.Single<Person>(p => p.FirstName == "Sergi"));
// comparing expressions
Expression<Func<Person, bool>> expression = p => p.FirstName == "Sergi");
session.Verify(x => x
.Single(It.Is<Expression<Func<Person, bool>>>(e => e == expression));
Все они приводят к следующей ошибке:
Ожидаемый вызов на макет хотя бы один раз, но никогда не выполнялся
Любые идеи о том, как это можно сделать? Я использую последний Moq от NuGet, версия 4.0.10827.0
ОБНОВЛЕНИЕ: Конкретный пример
Я вижу, что всякий раз, когда я использую строковые литералы внутри лямбда, Verify
работает. Как только я сравниваю переменные, это терпит неудачу. Пример:
// the verify
someService.GetFromType(QuestionnaireType.Objective)
session.Verify(x => x.Single<Questionnaire>(q =>
q.Type == QuestionnaireType.Objective));
// QuestionnaireType.Objective is just a constant:
const string Objective = "objective";
// the method where it called (FAILS):
public Questionnaire GetFromType(string type)
{
// this will fail the Verify
var questionnaire = _session
.Single<Questionnaire>(q => q.Type == type);
}
// the method where it called (PASSES):
public Questionnaire GetFromType(string type)
{
// this will pass the Verify
var questionnaire = _session
.Single<Questionnaire>(q => q.Type == QuestionnaireType.Objective);
}
Почему Verify
завершается с ошибкой, как только я использую параметр метода в выражении лямбда?
Каким будет правильный способ написать этот тест?