1

我刚开始使用NMock进行单元测试

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

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

但是,当我myMap.ContainsKey(item)在正在测试的单元内部进行操作时,它会返回false

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

我的问题是:

  • 您如何为 mocked 定义 Equals(object o) item
  • 或者是否有完全不同的解决方案。
4

3 回答 3

6

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

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

于 2011-12-10T16:48:55.917 回答
0

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

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

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

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

高温高压

于 2011-12-10T18:46:34.283 回答
0

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

于 2012-01-02T20:38:26.890 回答