2016-12-30 4 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); 
    } 

Есть ли другие способы сделать это? Я не застрял на этой сигнатуре метода для С.

Это также будет работать

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

так, чтобы можно было сделать

With(x=>x.someProp=someValue) 

ответ

0

Я не пользователь Moq, но это выглядит как SetupGet только определяет действие на собственность получить. Это похоже на A.CallTo в FakeItEasy.

Есть ли причина, чтобы не просто использовать

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

Рад, что это помогло. –

Смежные вопросы