2010-11-03 3 views
2

Есть ли способ настроить Moq Mock с использованием строкового параметра вместо выражения? Вы можете сделать это с помощью защищенных расширений для защищенной функции, но она выдает исключение, если оно открыто. Например, вот как вы могли бы настроить защищенную недействительную функцию с Moq:Функция установки в Moq со строкой

myMock.Protected().Setup("MyProtectedFunction"); 

Я хочу, чтобы иметь возможность делать то же самое с общественной функцией. Если я смогу это сделать, у меня уже есть код отражения, который может возвращать имена всех функций, которые мне нужно высмеять, и я могу надеяться на это, чтобы избежать необходимости устанавливать многие функции на огромном классе фабрики.

ответ

3

Интересная проблема, это почти возможно сделать с помощью выражений. Поскольку метод установки принимает выражение, вы можете создать его во время выполнения.

Единственный бит, который должен произойти во время компиляции, заключается в том, чтобы выдать выражение соответствующему лямбда-типу на основе возвращаемого типа издевающегося метода. К сожалению, Moq не обеспечивает перегрузку , снимая голый Expression, иначе можно было бы сделать то, что вы хотите на 100% во время выполнения.

public abstract class Fruit 
{ 
} 

public class Apple :Fruit 
{ 
} 

public interface IFactory { 
    Fruit CreateFruit(string type); 
    void VoidMethod(int intParameter); 
} 

[TestClass] 
public class UnitTest1 { 
    [TestMethod] 
    public void TestMethod1() { 
     var factoryMock = new Mock<IFactory>(); 

     Expression factoryCall = Expression.Lambda(
      Expression.Call(Expression.Variable(typeof(IFactory), "f"), "CreateFruit", new Type[]{}, Expression.Constant("Apple")), 
      Expression.Parameter(typeof(IFactory), "f")); 

     //factoryMock.Setup(f=>f.CreateFruit("Apple")).Returns(new Apple()); 

     factoryMock.Setup((Expression<Func<IFactory, Fruit>>)factoryCall).Returns(new Apple()); 
     var ret = factoryMock.Object.CreateFruit("Apple"); 
     Assert.IsInstanceOfType(ret, typeof(Apple)); 
    } 
} 
+0

Спасибо, с помощью нескольких настроек, это сделало это для меня. –

+0

Любой шанс, что вы написали, как вы решили всю проблему? Я пытаюсь сделать что-то подобное. –

+0

Привет, вы думаете, что можете предоставить такой код, но для настройки свойства вместо метода? Спасибо –

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