1

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甚至可以做到这一点吗?

谢谢!

4

2 回答 2

1

我不认为 N​​Mock3 库允许您这样做。文档很少,但我查看了 NMock3 的验收测试,找不到做这样的事情。

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

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

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

于 2013-02-13T09:44:03.593 回答
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); }));
于 2016-09-14T08:00:58.637 回答