2010-08-30 185 views
1

有必要檢查執行的抽象「的MyMethod」虛擬方法「MyAbstractClass」:如何使用抽象方法測試抽象類中的方法?

public abstract MyAbstractClass 
{ 
    public void MyMethod() 
    { 
     Testpassed = true; 
    } 

    public abstract int StatusCode{get;internal set;} // **EDIT**: internal setter was added 

    public bool TestPassed{get;private set;} 
} 

我試着做到以下幾點:

[TestMethod()] 
{ 
    Mock<MyAbstractClass> mockClass = new Mock<MyAbstractClass>(); 
    mockClass.Object.MyMethod(); 
    Assert.IsTrue(mockClass.Object.TestPassed); 
} 
上嘗試執行「

的MyMethod '生成以下錯誤:

方法 'set_StatusCode' 型 'MyAbstractClass`2Proxy0434d60c0f4542fb9b4667ead4ca3a18' 從程序集「DynamicProxyGenAssembly2, 版本= 0.0.0.0,文化=中立,公鑰=空」不具有 實現..

請指教,我怎麼能得到什麼問題呢?

非常感謝!

P.S.其實,我可以從MyAbstractClass繼承並提供'StatusCode'屬性的實現,但是我有一堆屬性需要實現...

回答

1

請參閱this answer關於部分嘲諷,我想你將不得不提供一個具體的實現。

+1

在鏈接的答案中,我看到以下內容:部分模擬僅在需要測試功能時纔有用抽象類的模擬實現抽象方法。這正是我所需要的。問題是:我不知道如何得到那個... – Budda 2010-08-31 13:44:40

1

我明白這不是對moq問題的回答,但無論如何。即使你有很多抽象屬性,VS也可以非常容易地添加空的(實際上是拋出的)實現。所以,如果MyMethod不依賴於這些屬性的設計,我會添加一個空的派生類並測試它。

+0

大概這是一個好主意。但對於這種情況下,如果類接口更改,我將需要更新'測試'類的接口,這並不是真正需要的...... – Budda 2010-08-31 13:52:29

2

您發佈的代碼運行正常(除了小錯拼)。我根本無法讓它失敗,同樣的錯誤。 Moq在運行時實現抽象屬性並使其返回默認值(在這種情況下爲0)。嘗試更新版本的Moq。

我也會提醒不要將測試邏輯放入類中。如果TestPassed的唯一目的是用於測試,那麼它絕對不屬於此處。如果您發佈實際代碼,我們可以提供更多幫助。

+0

謝謝。 'TestPass'僅用於演示目的。 :) 你說得對,原來的例子工作正常...抱歉,我的錯,我沒有檢查它(這是從我的例子簡化)。現在我發現嘲笑'內部'成員會出現這個問題...將嘗試解決這個問題。 再次感謝! – Budda 2010-08-31 13:51:43

+0

Moq使用Castle Dynamic Proxy在運行時創建模擬。如果您對內部成員有問題,那是因爲動態代理無法創建這些內容。您可以將InternalsVisibleTo添加到包含SUT的程序集中,並在參數中指定Castle Dynamic Proxy以使其全部工作。 – 2010-08-31 14:15:45

+0

我試圖用InternalsVisibleTo標記我的程序集,但它沒有幫助。應該是?可能是id做了一個錯誤的方法(只針對一個項目...不針對每個項目的程序集)... – Budda 2010-09-02 23:40:52