使用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。
发布于 2015-06-24 06:29:20
您需要使用以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()
);参数可以通过GetArgument泛型方法提取,该方法以参数类型作为泛型参数和参数位置(基于0)。
另外,您应该考虑对这种方法进行重构。这许多参数最好封装在参数对象类中。
var filterParameters = new FilterParameters
{
LocationGuid = guid,
Gender = Gender.Female,
};
var result = repo.FindAll(filterParameters);这将使新参数的引入更加容易,并将有助于避免类似的问题。
https://stackoverflow.com/questions/31018199
复制相似问题