如何测试属性是否来自另一个程序集

时间:2012-07-12 03:21:50

标签: c# unit-testing reflection internal func

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

[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是在内部设置的。意思是,如果我在另一个集会(我现在正在),我无法设置它。我无法访问Accessor的程序集,因为我不允许更改任何代码。我只被允许在另一个项目/程序集中创建一个测试。

那么我将如何测试GetReferenceValue?可以反思吗?

1 个答案:

答案 0 :(得分: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>班级设计可能出现问题。