2014-05-13 163 views
-2

我正在使用動態調度的項目。當用Moq單元測試我的一些方法時,我偶然發現了一些我不明白的東西。Moq單元測試動態調度

我試圖重現它下面的測試:

public class UnitTest1 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     Mock<Test> _m = new Mock<Test>(); 

     //if i do 
     //dispatch(_m.Object); //this line causes Exception 

     //Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 
     //'Castle.Proxies.TestProxy' doesn't contain définition for 'Object' 

     //but if i do 
     Test ts = _m.Object; 
     dispatch(ts); //this line works fine 

     //verify 
     _m.Verify(m => m.Display(), Times.Once()); 
    } 

    public void dispatch(Test p) 
    { 
     p.Display(); 
    } 
} 

public interface Test 
{ 
    void Display(); 
} 

}

有人能請解釋一下我爲什麼它不沒有投給Test工作?如何在沒有投射的情況下單元測試動態分配? (這是不可能的代碼......所以爲什麼我們使用動態調度)

謝謝

+0

爲什麼你把你的班級變成動態的,你知道什麼是動物使用?! –

+0

有沒有解決你的問題的答案?那麼請標記它! –

+0

'動態t = _m.Object;'不應該在問題中。對不起,這是我以前的一次嘗試。 – Jissai

回答

1

你爲什麼叫dispatch(t.Object);你應該有通話dispatch(t);

dynamic只是一個關閉的方式類型檢查器。

+0

因爲沒有調用'.Object',實例就是'Mock '而不是'Test','dispatch()'只處理'Test' – Jissai

+0

@Jissai在你的帖子的第一版中,你沒有't = _m。對象'因此't' **是'Test'類型的**,它沒有'Object'屬性。 – abto

+0

這個答案是最接近我的問題的實際來源,因爲我正在做一個額外的'動態t = _m.Object;'這將導致我錯誤地調用dispatch(t.Object)而不是調度(_m.Object)。但是,對我來說,回答有點神祕:)謝謝abto和chiccodoro的解釋。 – Jissai