尝试访问私有访问器时单元测试面临 NullReferenceException
Unit test faces NullReferenceException when try to access a private accessor
在主应用中:
namespace ConsoleApplication1
{
public class Patient
{
...
public double height { get; private set; }
并且在单元测试中:
Patient p1=new Patient();
BindingFlags flags=BindingFlags.Instance | BindingFlags.NonPublic;
typeof(Patient).GetField("height", flags).SetValue(p1, "67.2");
我的单元测试不起作用,它给了我
UnitTest.MyTest.idealCal threw exception:
System.NullReferenceException: Object reference not set to an instance
of an object.
错误发生在SetValue
行
如何解决?
您正在尝试检索 Field 但实际上您使用的是 属性.
考虑这种情况:
public class X
{
public double Height { get; private set; }
}
您现在可以使用此代码设置一个值:
void Main()
{
var obj = new X();
var property = typeof(X).GetProperty("Height", BindingFlags.Instance | BindingFlags.Public);
var setMethod = property.GetSetMethod(true);
setMethod.Invoke(obj, new object[]{ 5.0 });
Console.WriteLine (obj.Height);
}
工作很简单:获取 属性(注意命名约定),即 public,获取其私有设置方法(这就是 true
参数的用途)并调用setter 与您希望将其设置为的值。
请注意,作为单元测试的一部分访问私有成员通常表明您做错了什么。这个话题太大了,这里就不细说了。
在主应用中:
namespace ConsoleApplication1
{
public class Patient
{
...
public double height { get; private set; }
并且在单元测试中:
Patient p1=new Patient();
BindingFlags flags=BindingFlags.Instance | BindingFlags.NonPublic;
typeof(Patient).GetField("height", flags).SetValue(p1, "67.2");
我的单元测试不起作用,它给了我
UnitTest.MyTest.idealCal threw exception: System.NullReferenceException: Object reference not set to an instance of an object.
错误发生在SetValue
如何解决?
您正在尝试检索 Field 但实际上您使用的是 属性.
考虑这种情况:
public class X
{
public double Height { get; private set; }
}
您现在可以使用此代码设置一个值:
void Main()
{
var obj = new X();
var property = typeof(X).GetProperty("Height", BindingFlags.Instance | BindingFlags.Public);
var setMethod = property.GetSetMethod(true);
setMethod.Invoke(obj, new object[]{ 5.0 });
Console.WriteLine (obj.Height);
}
工作很简单:获取 属性(注意命名约定),即 public,获取其私有设置方法(这就是 true
参数的用途)并调用setter 与您希望将其设置为的值。
请注意,作为单元测试的一部分访问私有成员通常表明您做错了什么。这个话题太大了,这里就不细说了。