FakeItEasy ReturnLazily с более чем 4 аргументами метода
С FakeItEasy, я хочу подделать интерфейсный метод, чтобы вернуть некоторый пользовательский список, метод имеет более 4 аргументов, сигнатура метода такова:
IList<Employee> FindAll(DateTime dateFrom, DateTime dateTill, Guid locationId, Gender gender, int age);
Хотя у FakeItEasy есть метод ReturnsLazily, который поддерживает до 4 аргументов, поэтому для этого метода с 5 аргументами я не могу использовать функциональность ReturnsLazily.
A.CallTo(() => repAssign.FindAll(A<DateTime>.Ignored,A<DateTime>.Ignored,A<Guid>.Ignored,A<Gender>.Ignored,A<Int>.Ignored))
.ReturnsLazily((DateTime StartDate, DateTime EndDate, Guid locationId, Gender gender, int age) =>
return list.Where(...some filters here as per arguments...).ToList();
);
С FakeItEasy, пожалуйста, предложите, как использовать ReturnsLazily для методов, которые имеют более 4 аргументов.
1 ответ
Вам нужно использовать перегрузку, которая занимает IFakeObjectCall
в качестве параметра лямбда и извлекать аргументы оттуда:
Если требуется более сложное принятие решений или если метод имеет более 4 параметров, вспомогательные методы не будут работать. Используйте вариант, который принимает
IFakeObjectCall
вместо
A.CallTo(() => repAssign.FindAll(
A<DateTime>.Ignored,
A<DateTime>.Ignored,
A<Guid>.Ignored,
A<Gender>.Ignored,
A<Int>.Ignored))
.ReturnsLazily(call =>
list
.Where(x => call.GetArgument<Int>(4) > 1)
.ToList()
);
Аргументы могут быть извлечены через GetArgument
универсальный метод, который принимает тип аргумента в качестве универсального параметра и позицию аргумента (на основе 0).
На заметку, вы должны рассмотреть рефакторинг такого метода. Эти многие параметры лучше переносятся в класс объекта параметров:
var filterParameters = new FilterParameters
{
LocationGuid = guid,
Gender = Gender.Female,
};
var result = repo.FindAll(filterParameters);
Это значительно облегчит введение новых параметров и поможет избежать подобных проблем.