我來自Java EE世界,但現在我正在開發.Net項目。在Java中,當我想測試一個受保護的方法時,這很容易,只需要具有相同包名的測試類就足夠了。 C#有沒有類似的東西?單元測試受保護的方法是否有任何好的做法?我只發現框架和人們說我應該只測試公共方法。 它應該有可能沒有任何框架...單元測試受C#保護的方法
非常感謝。
我來自Java EE世界,但現在我正在開發.Net項目。在Java中,當我想測試一個受保護的方法時,這很容易,只需要具有相同包名的測試類就足夠了。 C#有沒有類似的東西?單元測試受保護的方法是否有任何好的做法?我只發現框架和人們說我應該只測試公共方法。 它應該有可能沒有任何框架...單元測試受C#保護的方法
非常感謝。
您可以繼承您在測試類上測試的類。
public class Test1 : SomeClass
{
Asert.AreEqual(1, SomeClass.ProtectedMethod());
}
也許我錯了,但我覺得如果測試需要反射是因爲我做錯了什麼。但如果在C#中這是很正常的,那麼我會習慣。 – fiso
我也不想使用它。如果你不知道,我只是想指出這種技術。對我而言,至少對於您而言,您可能有一種私密方法,您想單獨進行測試,以便能夠通過大量輸入和預期結果輕鬆進行測試。 –
我認爲使用反射是一種合理的方式來測試一個類的非公共特徵。我一直用Java來做,因爲否則你必須使用「不正確的」修飾符,這樣才能測試一個正確構造的類。如果你需要Private或Protected,你應該仍然可以測試,而不需要向真實的類添加垃圾代碼以允許訪問(並且可以用來從安全角度導致你的代碼失敗)。 – millebi
您可以使用PrivateObject類來訪問所有的私有/受保護的方法/場。
PrivateObject是Microsoft單元測試框架中的一個類,它是一個包裝程序,可以使通常調用不可訪問的成員進行單元測試。
如果解釋什麼是PrivateObject,這個答案會受益匪淺。 –
這非常簡單,只需通過文檔 https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.privateobject.aspx –
您可以在繼承您要測試的類的新類中公開受保護的方法。
public class ExposedClassToTest : ClassToTest
{
public bool ExposedProtectedMethod(int parameter)
{
return base.ProtectedMethod(parameter);
}
}
另一種選擇是使用internal
這些方法,然後使用InternalsVisibleTo
,讓您的測試組件訪問這些方法。這並不能阻止相同程序集中的其他類所使用的方法,但它確實會阻止它們被其他不是您的測試程序集的程序集所訪問。
這並不能給你提供儘可能多的封裝和保護,但是它非常簡單直觀並且非常有用。
添加到AssemblyInfo.cs
在組裝包含內部方法
[assembly: InternalsVisibleTo("TestsAssembly")]
謝謝您的快速答覆。我測試了它的工作。我不知道這是否會是一個很好的方法,但至少我可以從單元測試開始。 – fiso
@unarity如果我的測試類沒有參數構造函數(例如它只有4個參數構造函數),該怎麼辦?當我從它派生出來的時候,我的測試類不會用'TestClass不包含帶0參數的構造函數'編譯錯誤 –
我在我的單元測試項目中添加了一個'Testable'類extends類,並將其所有受保護的方法'TestableMethods'並根據需要重新實現匹配的構造函數。同樣的結果,但我喜歡將測試與實現分開。 – Gui