1

リフレクションを使用して、あるオブジェクト タイプから別のオブジェクト タイプに変換するメソッドがいくつかあります。私は Moq を介して変換メソッドをテストしている最中で、処理方法がわからない動作に遭遇しました。Moq オブジェクトを調べて PropertyInfo を取得すると、さらに 2 つのオブジェクトが得られます。

  • Moq.Mock``1[Namespace.Class+IElement] Mock
  • Moq.Mock Mock

これを再現するコードは次のとおりです。

public void Moq_Reflection() {
    var realElement = new Stuff();

    // Produces 2 items
    PropertyInfo[] pInfo = realElement.GetType().GetProperties(); 

    var mockElement = new Mock<IElement>();
    mockElement.Setup(e => e.Property1).Returns(12);
    mockElement.Setup(e => e.Property2).Returns(42);

    // Produces 4 items
    pInfo = mockElement.Object.GetType().GetProperties();
}

public interface IElement { 
    int Property1 { get; set; } 
    int Property2 { get; set; } 
}

public class Stuff : IElement
{
    public int Property1
    {
        get { return -1; }
        set { }
    }

    public int Property2
    {
        get { return -2; }
        set { }
    }
}

これらのプロパティを取得せずに Moq オブジェクトを反映する方法はありますか?

4

2 に答える 2

1

今日の午後、これについてもっと考えていたので、別のアイデアがあります。

これを自分のプロジェクトでコーディングする場合は、オブジェクトの反射を抽象化します。オブジェクトのプロパティを返すクラスのコントラクトを定義するインターフェイスを作成し、リフレクションを使用して一連のプロパティを返すことによってそのインターフェイスを実装するクラスを作成します。おそらくあなたがしていることと同じです。

しかしその後のテストでは、インターフェイスの新しい実装を作成しますが、モック オブジェクトの不要なプロパティを除外するために必要なルールを追加します。私のライブ コードには、テストに必要なコードが含まれていません。

私はただ助けようとして、その考えを出さなければなりませんでした。幸運を!

于 2009-07-20T19:15:03.330 に答える
0

LinqPad のコードを調べたところ、これら 2 つのプロパティを除外するために見つけた唯一の解決策は、PropertyType または Name に「Mock」が含まれているかどうかに基づいてそれらを除外することでした。例えば:

pInfo.Where(item => item.PropertyType.ToString().Contains("Mock") == false);
pInfo.Where(item => item.Name.Contains("Mock") == false);

ぎりぎりのハッキーですが、フィルタリングできる唯一の属性です。反射自体をフィルタリングする方法はないと思います。

于 2009-07-20T17:49:08.137 に答える