我正在尝试测试这种方法:
[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?可以反思吗?
答案 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>
班级设计可能出现问题。