2016-12-30 8 views
0

"빌더"중 하나에서 MOQ SetupGet을 사용하는 다음과 같은 방법이 있습니다. 필자는 FakeItEasy를 사용하기 위해 다시 쓰기를 시도했지만, WithReturnType은 유형을 알려주는 범용 버전 만 제공하기 때문에 FakeItEasy를 사용하려고 시도했지만이를 수행하는 방법이없는 것으로 보입니다. 런타임에 결정된 실제 유형의 비 제네릭 버전은 없습니다.MOQ 속성 설정을 FakeItEasy로 변환

허용 전체 30 분을 보냈습니다. FakeItEasy에, 그래서 거기에 나는 그것이 FakeItEasy를 사용하여 다시 쓰기 시도 표현의 내 제한된 지식을 ... MOQ

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

기존 방법보다 나은 방법이 될 수도 있지만 나는를 설정할 수 없습니다 반환 값.

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) 

그래서 그 사람이 내가 MOQ 사용자 아니에요

With(x=>x.someProp=someValue) 

답변

0

을 할 수있는 일,하지만 SetupGet 그냥 속성의 get에 대한 작업을 정의하는 것 같습니다. 이것은 FakeItEasy의 A.CallTo과 같습니다.

단지

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

를 사용하지 않는 이유가 있나요?

당신은 정말 대신, 당신은 단지 크게 재산의 방법을 사용하는 경우에도

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

또는를 사용합니다 (예에서 작업) 고려할 수

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

같은 것을 호출 할 수있게하려면 이름 :

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

두 번째 메서드 서명을 얻으려고했습니다. (Expression > 표현식)이 작동하고 거기에 TProperty가 없으며 generic 인수를 완전히 잊었습니다. 그 점을 지적 해 주셔서 감사합니다. – epitka

+0

도움이 된 것을 기쁘게 생각합니다. –