2012-06-15 76 views
0

我嘲笑在這種情況:接口分流

class A 
{ 
    public IB B {get; set;} 
} 

interface IB 
{ 
    //methods 
} 

class B : IB 
{ 
    //IB methods 
} 

public SimpleMockTest() 
{ 
    var mockIB = new Mock<IB>(); 
    var a = new A{B=mockIB.Object}; 
    //do stuff with A, then verify methods on IB were called  
} 

public TheKindOfTestIWantToDo() 
{ 
    var actualB = new B(); 
    var mockIB = new Mock<IB>(); 
    var splitter = new Splitter<IB>(actualB, mockIB.Object); //I need something like this 
    var a = new A{B=splitter}; 
    //do stuff with A, methods invoked on splitter IB get passed to both supplied instances 
    //of IB (actualB, and the mockIB). Allowing me to verify the calls as well as have the methods invoked on the actual B object. 
    //OR: 
    var mockIB2 = new Mock<IB>(actualB); //behaviour is dictated by the actual, but allows verification 
    var a2 = new A{B=mockIB2.Object}; 
} 

所以我某種代理工廠,將genericly支持的接口,並調用相同的方法在多個接口上之後。當然,如果一個方法返回一個值,每個方法都需要返回相同的值,或者可能需要精確。

我想在測試過程中有效地偵聽接口調用,但沒有模擬結束行。

我使用Moq如果它有任何區別。

+0

請詳細解釋一下嗎? 「我想在測試過程中有效地監聽接口調用,但沒有模擬線路的終結。」 –

+0

@MicahArmantrout對象A通過接口IB調用B上的方法。我想驗證那些電話,同時仍然讓他們在B上登記。 – weston

回答

4

據我所知,對於actualB上的所有方法都沒有辦法做到這一點。

我想你想要的東西,如:

public TheKindOfTestIWantToDo() 
{ 
    var actualB = new B(); 
    var mockIB = new Mock<IB>(); 
    mockIB.Setup(b => b.Foo()).Returns(() => actualB.Foo()) 
    var a = new A { B = mockIB }; 
    //do stuff with A, methods invoked on splitter IB get passed to both supplied instances 
    //of IB (actualB, and the mockIB). Allowing me to verify the calls as well as have the methods invoked on the actual B object. 
} 

你或許應該重新考慮你的單元測試策略,雖然。 A的行爲應該可以測試而不依賴於B的行爲。嘗試讓mockIB返回特定值,然後爲B編寫一組不同的測試。

+0

我同意史蒂夫。你的測試不應該依賴你的依賴關係的實現。 –

+0

是的,我有自己的測試A和B,所以我看你從哪裏來。對A和B一起進行測試是否不好?我不應該試圖測試他們之間的內部溝通?只是將這2個作爲單個組件進行黑盒。 – weston

+0

在這種情況下,您正在進行集成測試,並且我沒有看到爲什麼您需要確保實際調用任何特定方法的原因,因爲您應該在單元測試中聲明這一點。 –