繁体   English   中英

FakeItEasy ReturnLazily具有超过4个参数的方法

[英]FakeItEasy ReturnLazily with more than 4 arguments method

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

     IList<Employee> FindAll(DateTime dateFrom, DateTime dateTill, Guid locationId, Gender gender, int age);

尽管FakeItEasy具有ReturnLazily方法,该方法仅支持4个参数,所以对于这5个参数方法,我无法使用ReturnLazily功能。

    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,请建议如何对具有4个以上参数的方法使用ReturnLazily。

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

如果需要更高级的决策,或者该方法具有四个以上参数,那么便捷方法将不起作用。 使用采用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);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM