Функция настройки в Moq со строкой - PullRequest
2 голосов
/ 04 ноября 2010

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

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

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

1 Ответ

2 голосов
/ 04 ноября 2010

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

Единственный бит, который должен произойти во время компиляции, - это приведение выражения к соответствующему лямбда-типу, основанному на типе возврата метода mocked. К сожалению, Moq не обеспечивает перегрузки Setup, принимая голый 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));
    }
}
...