我正在测试作为层次结构一部分的类。我一直在设置我的测试类与测试对象,并允许访问该对象的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