2016-12-30 9 views
0

「ビルダー」の1つでは、MOQ SetupGetを使用する以下のメソッドがあります。私はFakeItEasyを使用するように書き直そうとしましたが、WithReturnTypeはタイプを前もって知っていなければならない汎用バージョンしか提供していないため、FakeItEasyを使用するために書き直そうとしました。 実行時に決定される実際のタイプの非ジェネリックバージョンはありません。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のためのこのメソッドシグネチャに固執していません。 1は

With(x=>x.someProp=someValue) 

答えて

0

を行うことができるように

これも

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

を働くだろう、私は部品番号のユーザーではないんだけど、ちょうどプロパティのget上のアクションを定義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

私は二次メソッドシグネチャを取得しようとしていました(式 epitka

+0

喜んで助けました。 –

関連する問題