如何在单元测试中访问私人会员?我尝试使用PrivateObject,但重载构造函数在这里,我得到_inkContainerValue的错误。我可以在不使用类对象的情况下访问私有成员吗?
public class Pen
{
private int _inkContainerValue = 1000;
#region Constructors
public Pen(int inkContainerValue)
{
this._inkContainerValue = inkContainerValue;
}
#endregion
}
}
答案 0 :(得分:0)
PrivateObject pObj = new PrivateObject(typeof(Pen));
int privateInkContainerValue = (int)pObj.GetField("_inkContainerValue");
尝试上面的代码,通过单元测试中的PrivateObject类获取_inkContainerValue字段的值。
// Following is overloaded version to pass value to actual Pen class's constructor.
PrivateObject pObj = new PrivateObject(typeof(Pen), new object[]{12});
int privateInkContainerValue = (int)pObj.GetField("_inkContainerValue");
我现在没有编辑。理想情况下,语法应该有效。
答案 1 :(得分:0)
我可以在不使用类对象的情况下访问私有成员吗?
没有。您必须拥有一个对象实例才能从该对象中提取数据。
没有冒犯,但由于构造函数重载而使用Reflection的犹豫不管似乎没有实际意义。如果您有实例,则不应该阻止您使用Reflection,否则不会创建一个实例。
以下是使用Reflection从_ink
获取值的示例。它还向您展示了如何在不使用构造函数的情况下获取实例。但请注意,无将被初始化。正如你在代码中看到的那样,_ink
将是0
而不是1000
。
public class Pen
{
int _ink = 1000;
public Pen(int ink)
{
_ink = ink;
}
}
void Test()
{
//Create the object and check constructor set the value
var pen = new Pen(5);
var field = pen.GetType().GetField("_ink", BindingFlags.NonPublic|BindingFlags.Instance);
// This should pass.
Debug.Assert((int)field.GetValue(pen) == 5);
// Create the pen without using constructor.
// No matter what, nothing is initialized meaning _ink is 0 and not 1000.
// Hence, uninitialized.
var uninitializedPen = (Pen)FormatterServices.GetUninitializedObject(typeof(Pen));
field = uninitializedPen.GetType().GetField("_ink", BindingFlags.NonPublic|BindingFlags.Instance);
//This will fail.
Debug.Assert((int)field.GetValue(uninitializedPen) == 1000);
}
要使用FormatterServices
类,您需要导入System.Runtime.Serialization
命名空间。