2 Stimmen

Rhino Mocks: Wie kann ich Zahlen aus einer Sequenz zurückgeben

Ich habe ein Enumerable-Array

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

Bei jedem aufeinanderfolgenden Aufruf der Mock-Methode, die ich teste, möchte ich einen Wert aus diesem Array zurückgeben.

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 machen kann?

4voto

bahadorn Punkte 518

Es gibt immer statische gefälschte Objekt, aber diese Frage ist über Rhino-Mocks, so dass ich Ihnen mit der Art und Weise, ich werde es tun, zu präsentieren. Der Trick ist, dass Sie eine lokale Variable als Zähler erstellen und diese in Ihrem anonymen Delegaten/Lambda verwenden, um zu verfolgen, wo Sie sich im Array befinden. Beachten Sie, dass ich den Fall nicht behandelt habe, dass 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());
}

1voto

Darren Punkte 931

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

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

Das Mock Repository wendet die Erwartungen der Reihe nach an.

0voto

vrdhn Punkte 3956

IMHO wird der Ertrag dies regeln. Link .

Etwa so:

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

0 Stimmen

Wie genau soll das funktionieren? Ich verstehe nicht, Return akzeptiert keinen Delegatentyp.

0voto

Gishu Punkte 130442

Gibt es einen Grund, warum Sie hier eine Attrappe haben müssen...
Wenn nicht, würde ich mich für eine gefälschte Klasse entscheiden. Das ist viel einfacher und ich weiß, wie man es dazu bringt :) Ich weiß nicht, ob Mock-Frameworks diese Art von benutzerdefiniertem Verhalten bieten.

0 Stimmen

Hauptsächlich, weil ein Mock weniger Arbeit macht und weil ich sicherstellen möchte, dass die Methode so wenig wie möglich aufgerufen wurde. Na ja, vielleicht muss ich das tun.

0 Stimmen

:) In diesem Fall, es sei denn, jemand anderes Beiträge eine kürzere rhino-mock Version würde ich für eine gefälschte Klasse und Lesbarkeit FTW gehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X