尝试访问私有访问器时单元测试面临 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 与您希望将其设置为的值。

请注意,作为单元测试的一部分访问私有成员通常表明您做错了什么。这个话题太大了,这里就不细说了。