Rhino Mocks:如何从序列中返回数字

时间:2008-09-16 03:55:59

标签: c# .net rhino-mocks

我有一个Enumerable数组

int meas[] = new double[] {3, 6, 9, 12, 15, 18};

在我正在测试的mock方法的每次连续调用中,我想从该数组返回一个值。

using(_mocks.Record()) {
  Expect.Call(mocked_class.GetValue()).Return(meas); 
}
using(_mocks.Playback()) {
  foreach(var i in meas)
    Assert.AreEqual(i, mocked_class.GetValue();    
}

有没有人知道我该怎么做?

4 个答案:

答案 0 :(得分:4)

总是有静电假物体,但这个问题是关于犀牛嘲笑的,所以我按照我的方式向你展示。 诀窍是你创建一个局部变量作为计数器,并在你的匿名委托/ 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());
}

答案 1 :(得分:1)

如果功能是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();    
}

模拟存储库将按顺序应用期望。

答案 2 :(得分:0)

恕我直言,收益率将处理这个问题。 Link

类似的东西:

get_next() {
  foreach( float x in meas ) {
    yield x;
  }
}

答案 3 :(得分:0)

你必须在这里有一个模拟的任何理由...
如果没有,我会去一个假班..更简单,我知道如何做到这一点:) 我不知道模拟框架是否提供这种自定义行为。