我正在測試作爲層次結構一部分的類。我一直在設置我的測試類與測試對象,並允許訪問該對象的PrivateObject
。當我嘗試訪問父類的私有成員時,我收到異常。如何使用PrivateObject訪問我的類和它的父類的私有成員?
到目前爲止,我發現的唯一解決方法是將指定基類的PrivateType
傳遞給PrivateObject
構造函數,但它不適用於子類的私有成員。
有什麼辦法可以做到這一點,也許通過在私有對象的Get *方法上使用綁定標誌參數?
我嘗試使用自動生成的Accessor類(右鍵單擊主類Create Private Accessor)。然而,情況更糟糕:它顯示了一個我可以讀取的屬性,但它引發了與PrivateObject相同的異常,並且沒有其他選項可以用來修復異常(綁定標誌或其他選項)。
這是我的示例測試代碼。我希望有一些方法來構建和使用PrivateObject來檢索這兩個字段。
public class BaseClass
{
private int one = 1;
}
public class SubClass : BaseClass
{
private int two = 2;
}
[TestClass]
public class UnitTest1
{
BindingFlags flags = BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
[TestMethod]
public void TestMethod1()
{
SubClass test = new SubClass();
PrivateObject priv = new PrivateObject(test);
Assert.AreNotEqual<int>(0, (int)priv.GetFieldOrProperty("one", flags)); // System.MissingMethodException: Method 'PrivateObjectTester.SubClass.one' not found.
Assert.AreNotEqual<int>(0, (int)priv.GetFieldOrProperty("two", flags));
}
[TestMethod]
public void TestMethod2()
{
SubClass test = new SubClass();
PrivateObject priv = new PrivateObject(test, new PrivateType(typeof(BaseClass)));
Assert.AreNotEqual<int>(0, (int)priv.GetFieldOrProperty("one", flags));
Assert.AreNotEqual<int>(0, (int)priv.GetFieldOrProperty("two", flags)); // System.MissingMethodException: Method 'PrivateObjectTester.BaseClass.two' not found.
}
}
正如旁註所示,您可以使用PrivateObject訪問受保護的成員 – 2012-09-04 19:07:27