【问题标题】:Converting an MOQ property setup to FakeItEasy将 MOQ 属性设置转换为 FakeItEasy
【发布时间】:2016-12-31 02:45:44
【问题描述】:

在“构建器”之一中,我们有以下使用 MOQ SetupGet 的方法。我尝试重写它以使用 FakeItEasy,但似乎没有办法做到这一点,因为 WithReturnType 仅提供通用版本,其中类型必须预先知道。 没有非泛型版本,它采用在运行时确定的实际类型。

当然,我已经花了整整 30 分钟。在 FakeItEasy 上,所以可能有更好的方法...

带有最小起订量的原始方法

public void With<TProperty>(Expression<Func<TCommand, TProperty>> expression, TProperty value)
{
      CommandFake.SetupGet(expression).Returns(value);
}

由于我对表达式的了解有限,我尝试重写它以使用 FakeItEasy,但我无法设置返回值。

    public void With<TProperty>(Expression<Func<TCommand, TProperty>> expression, TProperty value)
    {
        var methodName = string.Empty;

        var e = (LambdaExpression) expression;

        if (e.Body.NodeType == ExpressionType.MemberAccess)
        {
            var memberInfo = ((MemberExpression) e.Body).Member;
            if (memberInfo.MemberType == MemberTypes.Property)
            {
                methodName = "get_" + memberInfo.Name;
            }
            //A.CallTo(CommandFake).Where(call => call.Method.Name == methodName)
            //    .WithReturnType<>()
        }

        //CommandFake.SetupGet(expression).Returns(value);
    }

还有其他方法可以做到这一点吗?我没有坚持使用这个方法签名。

这也行

 public void With(Expression<Action<TCommand>> expression)

这样就可以了

With(x=>x.someProp=someValue)

【问题讨论】:

    标签: fakeiteasy


    【解决方案1】:

    我不是起订量用户,但看起来SetupGet 只是定义了对属性获取的操作。这似乎等同于 FakeItEasy 中的 A.CallTo

    有理由不直接使用

    A.CallTo(() => CommandFake.TheProperty).Returns(value));
    

    ?

    如果你真的希望能够调用类似的东西

    With(f => f.TheProperty, 7);
    

    您可以(根据您的示例)使用

    public void With<TProperty>(Expression<Func<TCommand, TProperty>> expression, TProperty value)
    {
        var methodName = string.Empty;
    
        var e = (LambdaExpression)expression;
    
        if (e.Body.NodeType == ExpressionType.MemberAccess)
        {
            var memberInfo = ((MemberExpression)e.Body).Member;
            if (memberInfo.MemberType == MemberTypes.Property)
            {
                methodName = "get_" + memberInfo.Name;
            }
            A.CallTo(CommandFake).Where(call => call.Method.Name == methodName)
                .WithReturnType<TProperty>()
                .Returns(value);
        }
    }
    

    或者甚至考虑直接使用属性的方法,而不是名称:

    public void With<TProperty>(Expression<Func<TCommand, TProperty>> expression, TProperty value)
    {
        var e = (LambdaExpression)expression;
    
        if (e.Body.NodeType == ExpressionType.MemberAccess)
        {
            var memberInfo = ((MemberExpression)e.Body).Member;
            if (memberInfo.MemberType == MemberTypes.Property)
            {
                A.CallTo(CommandFake).Where(call =>
                            call.Method == ((PropertyInfo)memberInfo).GetMethod)
                    .WithReturnType<TProperty>()
                    .Returns(value);
            }
        }
    }
    

    【讨论】:

    • 我试图让辅助方法签名 With(Expression> expression) 工作,但我没有 TProperty,我完全忘记了通用参数:)。感谢您指出这一点。
    • 很高兴它有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多