2011-06-18 28 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(); 
    } 
} 
相關問題