0

在主应用程序中:

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 抛出异常:System.NullReferenceException:对象引用未设置为对象的实例。

错误发生在SetValue

如何解决?

4

1 回答 1

1

您正在尝试检索Field但您实际上正在使用Property

考虑这种情况:

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);
}

工作很简单:获取公共的属性(注意命名约定),获取其私有 set 方法(这就是true参数的用途)并使用您希望将其设置为的值调用该 setter。

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

于 2015-05-03T13:22:43.227 回答