2012-03-22 66 views
1

如何測試(抽象)類中接口方法實現的行爲,而不必將測試複製到每個類?單元測試接口的實現,怎麼做?

我有(抽象)類實現多個接口。我知道每個接口應該如何表現,我在測試方法中定義了這一點,以便我不必爲接口的每個實現手動重複這些測試。

我可以爲每個接口創建一個抽象類與測試,並有一個抽象方法CreateSUT()創建具體類的新實例。但是之後我不得不爲每個類實現的接口創建一個新的類,因爲C#不支持多繼承。有一個更好的方法嗎?

另請注意,我也想測試在具有幾個非抽象子類的抽象類中實現的接口,這會使事情稍微複雜化。


這個問題是不是我是否應該單元測試我的接口實現。意見不同,我決定這樣做,因爲我知道接口實現應該如何表現(從不返回空值,返回只讀集合等),並將這些測試放在一起使我更容易測試他們的實現,但是可能有很多。

+0

那麼有三個選項1.不要測試界面 - 你拒絕。 2.測試每個派生類。 3.只測試一個派生類。 – gdoron 2012-03-22 22:09:12

+0

我不太明白你在「我可以創建...」段落中所說的話。您不必在界面中包含工廠方法。我也不明白爲什麼你遇到了「缺乏多重繼承」的問題。你仍然可以有一個類實現幾個接口,這似乎是你的情況。 – Tormod 2012-03-22 22:59:09

回答

0

你可以用moq模擬抽象類或者創建一個實現所有接口的接口,然後讓你的抽象類實現你新創建的接口,然後模擬新接口。

+0

你能指出與回答我的問題有關的位嗎? – Virtlink 2012-03-22 22:27:53

+0

更新爲新內容 – 2012-03-22 22:45:51

0

嗯,我不明白爲什麼你需要這個,但你可以寫你的接口測試的靜態助手類。例如。

public static class IFooTests 
{ 
    public static void ShouldDoSomething(this IFoo foo) 
    { 
     // Assert something 
    } 
} 

後來爲實現IFoo的接口可以快速創建測試方法中的每個對象:

[Test] 
public void ShouldDoSomething() 
{ 
    Bar bar = new Bar(); // create and setup your concrete object 
    bar.ShouldDoSomething(); // call interface test extension 
} 
0

您可以創建一個列表來保存你的接口的所有具體實現的實例,然後通過每個元素在該列表中並在您的測試中聲明不變量。

根據您的測試框架,應該有一種方法在測試失敗時獲得可操作的反饋。

快速搜索發現我這個對NUnit的:http://www.nunit.org/index.php?p=testCaseSource&r=2.5.9