任何人都可以了解如何使用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)}));
}
答案 0 :(得分:1)
您正在尝试获取声明为none的类型的泛型参数。你想要的是从它实现的接口获取它。这只是一个粗略的例子,但它应该说明解决方案的想法:
myMock.GetType().GetInterfaces()
.Single(x => x.Name.Contains("IDictionary")).GetGenericArguments();
这里我们正在寻找名为IDictionary
的mock实现的接口(可能更好的方法是使用.GetGenericTypeDefinition
与typeof(IDictionary<,>)
进行比较)并从中获取泛型参数。
为了完整性,这里有一个更强大(并且不那么紧凑)的解决方案(虽然难以阅读):
myMock.GetType().GetInterfaces()
.Single(x => x.IsGenericType &&
x.GetGenericTypeDefinition() == typeof(IDictionary<,>))
.GetGenericArguments();