Rhino Mocks:如何从序列中返回数字
时间:2020-03-05 18:55:06 来源:igfitidea点击:
我有一个可枚举的数组
int meas[] = new double[] {3, 6, 9, 12, 15, 18};
在我要测试的模拟方法的每个连续调用中,我想从该数组返回一个值。
using(_mocks.Record()) { Expect.Call(mocked_class.GetValue()).Return(meas); } using(_mocks.Playback()) { foreach(var i in meas) Assert.AreEqual(i, mocked_class.GetValue(); }
有谁知道我该怎么做?
解决方案
回答
恕我直言,产量可以解决这个问题。
关联。
就像是:
get_next() { foreach( float x in meas ) { yield x; } }
回答
任何必须在此处进行模拟的原因...
如果没有,我会去上假课。.更简单,我知道如何做到这一点:)
我不知道模拟框架是否提供这种自定义行为。
回答
如果功能是GetValue()连续返回每个数组元素,则我们应该能够设置多个期望值,例如
using(_mocks.Record()) { Expect.Call(mocked_class.GetValue()).Return(3); Expect.Call(mocked_class.GetValue()).Return(6); Expect.Call(mocked_class.GetValue()).Return(9); Expect.Call(mocked_class.GetValue()).Return(12); Expect.Call(mocked_class.GetValue()).Return(15); Expect.Call(mocked_class.GetValue()).Return(18); } using(_mocks.Playback()) { foreach(var i in meas) Assert.AreEqual(i, mocked_class.GetValue(); }
模拟存储库将按顺序应用期望。
回答
总是有静态的假物体,但是这个问题是关于犀牛的,所以我向我们介绍了如何做。
诀窍是,我们创建一个局部变量作为计数器,并在匿名委托/ lambda中使用它来跟踪我们在阵列上的位置。注意,我没有处理GetValue()被调用超过6次的情况。
var meas = new int[] { 3, 6, 9, 12, 15, 18 }; using (mocks.Record()) { int forMockMethod = 0; SetupResult.For(mocked_class.GetValue()).Do( new Func<int>(() => meas[forMockMethod++]) ); } using(mocks.Playback()) { foreach (var i in meas) Assert.AreEqual(i, mocked_class.GetValue()); }