Rhino Mocks: Как вернуть числа из последовательности - PullRequest
2 голосов
/ 16 сентября 2008

У меня есть массив Enumerable

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 голосов
/ 16 сентября 2008

Всегда есть статичный поддельный объект, но этот вопрос касается насмешек-носорогов, поэтому я представляю вам, как я это сделаю. Хитрость заключается в том, что вы создаете локальную переменную в качестве счетчика и используете ее в своем анонимном делегате / лямбде, чтобы отслеживать, где вы находитесь в массиве. Обратите внимание, что я не обработал случай, когда 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 голос
/ 16 сентября 2008

Если функциональность 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();    
}

В фиктивном хранилище будут применяться ожидания по порядку.

0 голосов
/ 16 сентября 2008

Любая причина, почему вы должны издеваться здесь ...
Если нет, я бы пошел на фальшивый класс .. Намного проще, и я знаю, как заставить его сделать это :) Я не знаю, предоставляют ли фиктивные фреймворки такое поведение.

0 голосов
/ 16 сентября 2008

ИМХО, доходность справится с этим. Link .

Что-то вроде:

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