2012-11-16 81 views
36

我來自Java EE世界,但現在我正在開發.Net項目。在Java中,當我想測試一個受保護的方法時,這很容易,只需要具有相同包名的測試類就足夠了。 C#有沒有類似的東西?單元測試受保護的方法是否有任何好的做法?我只發現框架和人們說我應該只測試公共方法。 它應該有可能沒有任何框架...單元測試受C#保護的方法

非常感謝。

回答

45

您可以繼承您在測試類上測試的類。

public class Test1 : SomeClass 
{ 
    Asert.AreEqual(1, SomeClass.ProtectedMethod()); 
} 
+0

謝謝您的快速答覆。我測試了它的工作。我不知道這是否會是一個很好的方法,但至少我可以從單元測試開始。 – fiso

+1

@unarity如果我的測試類沒有參數構造函數(例如它只有4個參數構造函數),該怎麼辦?當我從它派生出來的時候,我的測試類不會用'TestClass不包含帶0參數的構造函數'編譯錯誤 –

+1

我在我的單元測試項目中添加了一個'Testable'類extends類,並將其所有受保護的方法'TestableMethods'並根據需要重新實現匹配的構造函數。同樣的結果,但我喜歡將測試與實現分開。 – Gui

3

您可以使用反射來調用私有和受保護的方法。

在這裏看到更多:

http://msdn.microsoft.com/en-us/library/66btctbe.aspx

+5

也許我錯了,但我覺得如果測試需要反射是因爲我做錯了什麼。但如果在C#中這是很正常的,那麼我會習慣。 – fiso

+0

我也不想使用它。如果你不知道,我只是想指出這種技術。對我而言,至少對於您而言,您可能有一種私密方法,您想單獨進行測試,以便能夠通過大量輸入和預期結果輕鬆進行測試。 –

+0

我認爲使用反射是一種合理的方式來測試一個類的非公共特徵。我一直用Java來做,因爲否則你必須使用「不正確的」修飾符,這樣才能測試一個正確構造的類。如果你需要Private或Protected,你應該仍然可以測試,而不需要向真實的類添加垃圾代碼以允許訪問(並且可以用來從安全角度導致你的代碼失敗)。 – millebi

3

您可以使用PrivateObject類來訪問所有的私有/受保護的方法/場。

PrivateObject是Microsoft單元測試框架中的一個類,它是一個包裝程序,可以使通常調用不可訪問的成員進行單元測試。

+4

如果解釋什麼是PrivateObject,這個答案會受益匪淺。 –

+0

這非常簡單,只需通過文檔 https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.privateobject.aspx –

2

您可以在繼承您要測試的類的新類中公開受保護的方法。

public class ExposedClassToTest : ClassToTest 
{ 
    public bool ExposedProtectedMethod(int parameter) 
    { 
     return base.ProtectedMethod(parameter); 
    } 
} 
5

另一種選擇是使用internal這些方法,然後使用InternalsVisibleTo,讓您的測試組件訪問這些方法。這並不能阻止相同程序集中的其他類所使用的方法,但它確實會阻止它們被其他不是您的測試程序集的程序集所訪問。

這並不能給你提供儘可能多的封裝和保護,但是它非常簡單直觀並且非常有用。

添加到AssemblyInfo.cs在組裝包含內部方法

[assembly: InternalsVisibleTo("TestsAssembly")]