1

RhinoMocks でこれをどのように達成できるかについて、誰かが光を当てることができますか? ジェネリック型 (2 つの TypeParams を持つ) のモックを作成したいのですが、テスト対象のコードで GetType().GetGenericArguments() を呼び出しています。2 つの型が必要です。

たとえば、次のテストに合格することを期待していますが、失敗します。

    [Test]  
    public void Test()
    {
        // Mocking IDictionary<THash, T> fails, but new Dictionary<THash, T> passes
        var myMock = MockRepository.GenerateStub<IDictionary<int, float>>();
        var args = myMock.GetType().GetGenericArguments();
        Assert.That(args, Is.EquivalentTo(new Type[] {typeof(int), typeof(float)}));
    }
4

1 に答える 1

1

宣言されていない型のジェネリック引数を取得しようとしています。必要なのは、それが実装するインターフェースから取得することです。これは単なる大まかな例ですが、ソリューションのアイデアを説明する必要があります。

myMock.GetType().GetInterfaces()
    .Single(x => x.Name.Contains("IDictionary")).GetGenericArguments();

ここでは、その名前のモックによって実装されたインターフェースを探し(おそらくagainstIDictionaryを使用して比較する方がよいでしょう)、そこから一般的な引数を取得します。 .GetGenericTypeDefinitiontypeof(IDictionary<,>)

完全を期すために、より堅牢な(そして文字列が少ない)ソリューションを次に示します(読みにくいですが):

myMock.GetType().GetInterfaces()
    .Single(x => x.IsGenericType && 
                 x.GetGenericTypeDefinition() == typeof(IDictionary<,>))
    .GetGenericArguments();
于 2012-10-20T21:38:58.293 に答える