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

时间:2015-06-24 05:20:13

标签: c# unit-testing fakeiteasy

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

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

虽然FakeItEasy具有只支持4个参数的ReturnsLazily方法,但对于这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。

1 个答案:

答案 0 :(得分:4)

您需要使用以IFakeObjectCall作为lambda参数的重载并从there中提取参数:

  

如果需要更高级的决策,或者方法有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开始)。

另外,您应该考虑重构此类方法。这个参数更好地包含在parameter object class中:

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

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