【问题标题】:how to test if properties is from another assembly如何测试属性是否来自另一个程序集
【发布时间】:2012-07-12 03:21:50
【问题描述】:

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

[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?反射有帮助吗?

【问题讨论】:

    标签: c# unit-testing reflection internal func


    【解决方案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&lt;T&gt; 类设计可能有问题。

    【讨论】:

    • OMG...实际上我之前尝试过但没有成功,因为我用错了方法:.SetValue(personalProperty, p=>p, null);大声笑...所以那里不允许使用 lambda,直到现在我才知道 x in Func x = p => p;实际上是一个对象...谢谢!
    猜你喜欢
    • 1970-01-01
    • 2010-09-08
    • 2013-02-07
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多