与昨天的question相关。我实现了 solution提议者Mehrdad Afshari但这又引起了另一个问题。
回顾一下:我有一个包含 Type->IList<Type>
字典的类例如Cat->{cat1, cat2}, Zebra->{zebra1, zebra2}
哪里Cat
和Zebra
是 Animal
的子类。现在Mehrdad提出了以下方法来检索某种类型的所有动物:
IList<T> GetAnimalsOfType<T>() where T : Animal {
return dictionary[typeof(T)].OfType<T>().ToList();
}
这有效,但破坏了我的单元测试。原因是 Animal 是一个抽象类,所以我使用 Rhino Mocks stub 它(使用 animal = MockRepository.GenerateStub<Animal>();
)。我对此类的单元测试尝试创建一种新动物,然后查看它是否包含在字典中。
zoo.AddAnimal(animal);
IList<Animal> animals= zoo.GetAnimalsOfType<Animal>();
Assert.That(animals[0], Is.EqualTo(animal));
不幸的是Rhino Mocks创造的动物类型是一个动物代理,我要求使用 Animal,这打破了我的测试。关于如何纠正这种情况有什么建议吗?
更新:感谢大家提供的解决方案。
最佳答案
您可以询问刚刚插入的特定类型。您必须创建一个辅助函数:
T Get<T>(T parameterOnlyToInferTheType)
{
IList<Animal> animals= zoo.GetAnimalsOfType<T>();
return animals[0];
}
animal = MockRepository.GenerateStub<Animal>();
zoo.AddAnimal(animal);
Animal expected = Get(animal);
Assert.That(expected, Is.EqualTo(animal));
看起来还是有点狡猾,但应该可以。
一般来说,我倾向于避免在类型上对集合进行键控,因此我没有这些问题(例如,我在类上有一个返回枚举的属性等)。
关于c# - Rhino Mock stub 返回与预期不同的类型并破坏了我的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2145719/