具有泛型类型的RhinoMocks.GenerateMock,GetGenericArguments为空

时间:2012-10-20 21:32:49

标签: c# unit-testing reflection rhino-mocks

任何人都可以了解如何使用RhinoMocks实现这一目标吗?我想创建一个泛型类型的模拟(使用两个TypeParams),并且在代码测试中我调用GetType()。GetGenericArguments(),期望两个类型。

e.g。我希望以下测试通过,但它失败了:

    [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)}));
    }

1 个答案:

答案 0 :(得分:1)

您正在尝试获取声明为none的类型的泛型参数。你想要的是从它实现的接口获取它。这只是一个粗略的例子,但它应该说明解决方案的想法:

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

这里我们正在寻找名为IDictionary的mock实现的接口(可能更好的方法是使用.GetGenericTypeDefinitiontypeof(IDictionary<,>)进行比较)并从中获取泛型参数。

为了完整性,这里有一个更强大(并且不那么紧凑)的解决方案(虽然难以阅读):

myMock.GetType().GetInterfaces()
    .Single(x => x.IsGenericType && 
                 x.GetGenericTypeDefinition() == typeof(IDictionary<,>))
    .GetGenericArguments();