2011-06-18 30 views
7

使用最小起订量,如果我尝试直接在Foo嘲笑的方法,我得到这个:Invalid verify on a non-virtual (overridable in VB) member.如何在没有默认构造函数的情况下模拟对象的方法?

我的选择是嘲笑IFoo,它摆脱了上述问题,但我不能建造它,因为Foo没有无参数构造函数(Constructor arguments cannot be passed for interface mocks.)。我能做什么?

回答

6

你应该能够嘲笑的IFoo没有问题,你也没有理由来传递参数,当你嘲笑的接口。你的IFoo模拟将完全是(模拟!),并且将不知道Foo或任何实际的实现,所以传递构造函数参数是没有意义的。

编辑:我会补充说,模拟一个接口,如果存在几乎总是优于嘲笑具体的实现。如果你只有一个具体的实现,你想嘲笑它的事实可能意味着它将是一个很好的候选添加接口。

+1

你完全正确。我甚至没有考虑过这个问题,我只是想找点工作。谢谢。 – ryeguy

0

Moq创建一个代理对象,它要求你所有的模拟方法都可以被覆盖,并且你的类不被密封。所以你可以将你的方法标记为虚拟。

下面的代码工作正常:

public interface IFoo 
{ 
    int Test(int myParameter); 
    int TestInternal(int myParameter); 
} 

public class Foo : IFoo 
{ 
    private int _someConstructorArgument; 

    public Foo(int someConstructorArgument) 
    { 
     _someConstructorArgument = someConstructorArgument; 
    } 

    public virtual int Test(int myParameter) 
    { 
     return _someConstructorArgument + TestInternal(myParameter); 
    } 

    public virtual int TestInternal(int myParameter) 
    { 
     return myParameter; 
    } 
} 

public class Program 
{ 
    static void Main(string[] args) 
    { 
     var mock = new Mock<Foo>(MockBehavior.Loose, 50); 

     mock.Setup(x => x.TestInternal(100)) 
      .Returns(200); 

     mock.CallBase = true; 

     Console.WriteLine(mock.Object.Test(100)); 
     Console.ReadLine(); 
    } 
} 
相关问题