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);

Это значительно облегчит введение новых параметров и поможет избежать подобных проблем.

Другие вопросы по тегам