2

我有一个可枚举数组

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();    
}

有谁知道我该怎么做?

4

4 回答 4

4

总是有静态的假对象,但这个问题是关于 rhino-mocks 的,所以我向你展示我会做的方式。诀窍是您创建一个局部变量作为计数器,并在匿名委托/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());
}
于 2008-09-16T07:08:48.243 回答
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();    
}

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

于 2008-09-16T05:43:44.657 回答
0

恕我直言,yield 会处理这个问题。 链接

就像是:

get_next() {
  foreach( float x in meas ) {
    yield x;
  }
}
于 2008-09-16T04:28:16.210 回答
0

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

于 2008-09-16T04:39:09.197 回答