【问题标题】:FakeItEasy ReturnLazily with more than 4 arguments methodFakeItEasy ReturnLazily 具有超过 4 个参数的方法
【发布时间】:2016-05-31 20:25:09
【问题描述】:

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

【问题讨论】:

    标签: c# unit-testing fakeiteasy


    【解决方案1】:

    您需要使用将 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);
    

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

    【讨论】:

    • 感谢您的快速响应。它对我很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多