获得NMock期望基于接收的参数返回新对象

时间:2013-02-13 09:19:36

标签: c# .net nmock

NMock3是我选择的嘲弄框架,但我很难让它做到我想要的。

我需要的是根据满足期望时收到的一些参数,构建一个新对象并作为期望的一部分返回。

例如:

var mockFactory = new MockFactory();
var mockA = mockFactory.CreateMock<ObjectA>();
mockA.Expects.One.Method(c => c.BuildObjectB(null))
  .With(Is.TypeOf(typeof(string)))
  .WillReturn(new ObjectB(<?>));

在WillReturn中新建ObjectB时,如何访问期望收到的参数?这对NMock3来说是否可能?

谢谢!

2 个答案:

答案 0 :(得分:1)

我认为NMock3库不允许你这样做。文档很稀疏,但我查看了NMock3的Acceptance Tests,找不到像这样的东西。

我不认为这是一件非常糟糕的事情。单元测试通常是确定性的,因此将提前知道String的值是什么。单元测试是重复自己是一件好事的地方。它使测试更简单,更易读。所以在你的例子中我会说简单但完全可读的

var mockFactory = new MockFactory();
var mockA = mockFactory.CreateMock<ObjectA>();
mockA.Expects.One.Method(c => c.BuildObjectB("Frank")).WillReturn(new ObjectB("Frank"));

我可以想到一些(罕见的)非确定性案例,例如返回DateTime并且您事先不知道它将是哪一个。或许这个函数会被不同的参数调用很多次。在这些情况下,您可以使用一个简单的存根来跟踪它被调用的次数。

答案 1 :(得分:0)

您可以使用Collect.MethodArgument:

var mockFactory = new MockFactory();
var mockA = mockFactory.CreateMock<ObjectA>();
mockA.Expects.One.Method(c => c.BuildObjectB(null))
  .With(Is.TypeOf(typeof(string)))
  .WillReturn(Collect.MethodArgument<string>(0, delegate(string myString) { new ObjectB(myString); }));