1

我正在尝试测试这种方法:

[Test]
public void Test_GetReferenceValue()
{
  Person person= new Person() { Name = "PJ" };
  PersonalProperty<Person> personalProperty = new PersonalProperty<Person>();
  var result = personalProperty.GetReferenceValue(person);
  Assert.AreEqual("PJ", result);
}

GetReferenceValue 方法具有以下实现:

public override object GetReferenceValue(TOwner owner)
{
    Person value = this.Accessor(owner);

    if (value == null)
        return null;
    else
        return value.Name;
}

我试图找到 Accessor 属性的来源,我在另一个程序集中找到了它:

public class PersonalProperty<TOwner> : Property<TOwner, Person>
where TOwner : class
{
  public virtual Func<TOwner, TProperty> Accessor { get; internal set; }
}

如果我可以将代码放入我的测试中,我上面的测试将完美运行:

   personalProperty.Accessor = p =>p;

这是为 Func 委托定义/方法。但是,我不能这样做,因为 Accessor 是内部设置的。意思是,如果我在另一个程序集中(我现在就是),我无法设置它。我不能成为访问器程序集的朋友,因为我不允许更改任何代码。我只被允许在另一个项目/程序集中创建测试。

那么我将如何测试 GetReferenceValue?反思有帮助吗?

4

1 回答 1

1

是的,你可以使用反射来做到这一点。此函数可以设置属性值忽略 setter 访问修饰符:

public static void SetPropertyValue(object instance, string property, object value)
{
    instance.GetType().GetProperty(property).SetValue(instance, value, null);
}

用法:

Func<Person, Person> accessor = p => p;
SetPropertyValue(personalProperty, "Accessor", accessor);

PersonalProperty<T>无论如何,这表明类设计可能有问题。

于 2012-07-12T03:35:06.840 回答