1

谁能阐明我如何使用 RhinoMocks 实现这一目标?我想创建一个泛型类型的模拟(具有两个 TypeParams),并且在被测代码中我调用 GetType().GetGenericArguments(),需要两个类型。

例如,我希望通过以下测试,但它失败了:

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

在这里,我们正在寻找由具有名称的模拟实现的接口IDictionary(可能更好的是使用.GetGenericTypeDefinitionagainst进行比较typeof(IDictionary<,>))并从中获取通用参数。

为了完整起见,这里有一个更健壮(并且更简洁)的解决方案(虽然更难阅读):

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