使用Mock对象和Dictionary

时间:2011-12-10 16:45:04

标签: c# .net unit-testing mocking nmock

我刚刚开始使用NMock

进行单元测试

我的一个测试案例涉及在字典中添加一个条目,然后将其传递给正在测试的单元。我将地图定义为:

var item = new Mock<MyClass>().Object;
var myMap = new Dictionary<MyClass, IList<MyOtherClass>> 
             { 
                { item, completionRequirement }
             };

但是当我在被测单元内部myMap.ContainsKey(item)时,它会返回 false

我可以在字典中查看代理项目以检查它。我猜我需要在模拟item上做其他事情。(最有可能定义.Equals(object o))。

我的问题是:

  • 如何为模拟的item定义等于(对象o)。
  • 或者完全没有解决问题的方法。

3 个答案:

答案 0 :(得分:6)

您可能也想模拟字典。也就是说,重构使用IDictionary<MyClass,IList<MyOtherClass>,然后传入一个模拟字典。然后,您可以设置期望值,以便在必要时返回模拟对象。

在这种情况下,您可能根本不需要使用模拟。你不可能从你给我们的内容中得知,但我经常发现那些刚接触嘲笑的人有时会忘记你也可以使用真实对象,如果这些对象没有级联依赖。例如,你真的不需要模拟一个只是一个简单容器的类。创建一个并使用它,而不是。只是想一想。

答案 1 :(得分:0)

我喜欢按照tvanfosson所暗示的方式设置'假'物体的想法。

但是如果你想用一个模拟框架来做,我想你需要做的就是设置对item.Object应该是什么的期望。在Rhino Mocks中,语法类似于:

var knownObject = "myKey";
var mock = MockRepository.GenerateStub<IMyClass>();
mock.Stub(x=>x.Object).Return(knownObject);

那就是说,我不知道NMocks中的等效代码是什么,但是如果你正在使用它,就不难想出来(你可以随时询问用户组的问题)。

HTH

答案 2 :(得分:0)

http://richardashworth.blogspot.com/2011/12/using-reflection-to-create-mock-objects.html给出的方法是Java,但是使用Reflection提出了解决这个问题的另一种方法。