Frage

Ich habe eine Enumerable Array

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

Auf jedem aufeinander folgenden Aufruf an die Methode des Mock, die ich teste ich einen Wert aus diesem Array zurückgeben möchten.

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

Hat jemand eine Idee, wie ich das tun kann?

War es hilfreich?

Lösung

Es ist immer und überall statisches gefälschtes Objekt, aber diese Frage ist über Rhino-Mocks, so stellt ich Ihnen die Art, wie ich es tun würde. Der Trick ist, dass Sie eine lokale Variable als Zähler zu erstellen, und verwenden Sie es in Ihrem anonymen Delegaten / lambda, um zu verfolgen, wo Sie auf dem Array sind. Beachten Sie, dass ich nicht den Fall behandeln, die GetValue () mehr als 6 mal aufgerufen wird.

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

Andere Tipps

Wenn die Funktionalität das GetValue ist () gibt jedes Array-Element hintereinander, dann sollten Sie in der Lage sein, mehrere Erwartungen zB einzurichten

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

Die Mock-Repository wird die Erwartungen um gelten.

Gibt es Gründe, warum Sie einen Mock hier haben müssen ...
Wenn nicht, würde ich für eine gefälschte Klasse gehen .. viel einfacher und ich weiß, wie es zu bekommen, dies zu tun :) Ich weiß nicht, ob Mock Frameworks diese Art von benutzerdefinierten Verhalten liefern.

IMHO, Ausbeute wird damit umgehen. Link-.

So etwas wie:

get_next() {
  foreach( float x in meas ) {
    yield x;
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top