代码之家  ›  专栏  ›  技术社区  ›  Jason Jackson

带字符串的Moq中的Setup函数

  •  2
  • Jason Jackson  · 技术社区  · 14 年前

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

    我想在公共场合也能做同样的事情。如果我能做到这一点,我已经有了一些反射代码,可以返回我需要模拟的所有函数的名称,我可以希望以此为基础,避免在一个巨大的工厂类上设置许多函数。

    1 回复  |  直到 14 年前
        1
  •  2
  •   Igor Zevaka    14 年前

    有趣的问题是,使用表达式几乎可以做到这一点。因为setup方法接受一个表达式,所以可以在运行时构建它。

    编译时只需要根据模拟方法的返回类型将表达式强制转换为适当的lambda类型。不幸的是,Moq没有提供 Setup 超载裸体 Expression

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