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デリゲートの定義/メソッドを配置することです..しかし、アクセサーが内部的に設定されているため、これを行うことはできません。つまり、私が別のアセンブリにいる場合は設定できません(私は今です)。コードを変更することは許可されていないため、アクセサーのアセンブリと友達になることはできません。別のプロジェクト/アセンブリでのみテストを作成できます。

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 に答える