将MOQ属性设置转换为FakeItEasy

问题描述:

在其中一个“构建器”中,我们使用以下方法使用MOQ SetupGet。我试图重写它来使用FakeItEasy,但似乎没有办法做到这一点,因为WithReturnType只提供通用版本,其中类型必须事先知道。 没有非通用版本,需要在运行时确定的实际类型。将MOQ属性设置转换为FakeItEasy

准许我花了整整30分钟。在FakeItEasy,所以有可能是一个更好的办法...

原来的方法与MOQ

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); 
    } 

有没有其他方法可以做到这一点?我没有卡住With的这个方法签名。

这也将工作

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

这样就可以做到

With(x=>x.someProp=someValue) 

我不是个起订量的用户,但它看起来像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); 
     } 
    } 
} 
+0

我试图得到一个辅助方法签名With(Expression >表达式)工作,并且在那里我没有TProperty,并且我完全忘记了泛型参数:)。感谢您指出了这一点。 – epitka

+0

很高兴帮助。 –