2016-12-30 109 views
0

在其中一個「構建器」中,我們使用以下方法使用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) 

回答

0

我不是個起訂量的用戶,但它看起來像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

很高興幫助。 –