FakeItEasy ReturnLazily with more than 4 arguments 方法

dar*_*iya 3 c# unit-testing fakeiteasy

使用 FakeItEasy,我想伪造一个接口方法来返回一些自定义列表,该方法有 4 个以上的参数,方法的签名是这样的:

     IList<Employee> FindAll(DateTime dateFrom, DateTime dateTill, Guid locationId, Gender gender, int age);
Run Code Online (Sandbox Code Playgroud)

虽然 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();
        );
Run Code Online (Sandbox Code Playgroud)

使用 FakeItEasy,请建议如何将 ReturnsLazily 用于具有超过 4 个参数的方法。

k.m*_*k.m 6

您需要使用IFakeObjectCall作为 lambda 参数的重载并从那里提取参数:

如果需要更高级的决策,或者该方法有超过 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()
);
Run Code Online (Sandbox Code Playgroud)

可以通过GetArgument泛型方法提取参数,该方法将参数类型作为泛型参数和参数位置(从 0 开始)。

附带说明一下,您应该考虑重构此类方法。这许多参数最好包装到参数对象类中

var filterParameters = new FilterParameters
{
    LocationGuid = guid,
    Gender = Gender.Female,
};
var result = repo.FindAll(filterParameters);
Run Code Online (Sandbox Code Playgroud)

这将使引入新参数变得更加容易,并有助于避免此类问题。