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来说是否可能?
谢谢!
答案 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); }));