【问题标题】:Using Mock objects with Dictionary将 Mock 对象与 Dictionary 一起使用
【发布时间】:2011-12-10 16:45:03
【问题描述】:

我刚开始使用 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 定义 Equals(object o)。
  • 或者是否有完全不同的解决方案。

【问题讨论】:

  • 我打赌你写错了。请张贴调用ContainsKey 的代码。你不应该写myMap.ContainsKey(item),因为itemMock&lt;MyClass&gt; 类型,字典会期望MyClass 类型的实例。还是 NMock 的 Mock&lt;T&gt; 支持隐式转换?
  • 我更新了代码。感谢您指出差距!

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


【解决方案1】:

您可能还想模拟字典。也就是说,重构为使用IDictionary&lt;MyClass,IList&lt;MyOtherClass&gt;,然后传入一个模拟字典。然后,您可以设置期望,以便它根据需要返回模拟对象。

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

【讨论】:

  • 不模拟对象是不可能的,但是模拟字典本身的提示为我指明了正确的方向。
【解决方案2】:

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

【讨论】:

  • 请您尝试总结您发布的文章。这样一来,即使不是提问的人,查看主题的人也可以快速查看您的答案所包含的内容。
【解决方案3】:

我喜欢按照 tvanfosson 的建议设置“假”对象的想法。

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

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

也就是说,我不知道 NMocks 中的等效代码是什么,但如果您正在使用它应该不难弄清楚(您可以随时向用户组提问)。

HTH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 2012-05-21
    • 1970-01-01
    相关资源
    最近更新 更多