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

2024-03-20

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


您需要使用需要的重载IFakeObjectCall作为 lambda 参数并从中提取参数there https://fakeiteasy.readthedocs.io/en/stable/specifying-return-values/#return-values-calculated-at-call-time:

如果需要更高级的决策,或者方法的参数超过 4 个,那么便捷方法将不起作用。使用需要的变体IFakeObjectCall instead

 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 开始)。

另外,您应该考虑重构此类方法。这么多参数最好包含在参数对象类 http://www.refactoring.com/catalog/introduceParameterObject.html:

var filterParameters = new FilterParameters
{
    LocationGuid = guid,
    Gender = Gender.Female,
};
var result = repo.FindAll(filterParameters);

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FakeItEasy ReturnLazily 具有超过 4 个参数的方法 的相关文章

随机推荐