2017-03-10 3 views
1

Jemand weiß, wie eine Google-Mock-Methode zu programmieren wiederholt eine Folge von Aktionen auszuführen (einen nach dem anderen), wenn wir nicht wissen, die Anzahl der Anrufe auf das Verfahren im Voraus ?Google Mock: wiederholt ausführen Aktionen in einer bestimmten Reihenfolge

something like : 
EXPECT_CALL(mock, foo()) 
    .WillRepeatedly(.WillOnce(Return(2)); 
        .WillOnce(Return(40)); 
        .WillOnce(Return(7))); 

Verhalten:

mock.foo(); // return 2 
mock.foo(); // return 40 
mock.foo(); // return 7 

mock.foo(); // return 2 
mock.foo(); // return 40 
mock.foo(); // return 7 

mock.foo(); // return 2 
... 

Dank

+0

Die Idee der Einheit Tests sind, dass Sie im Voraus wissen, was erwartet wird, in im Test befindlichen Code geschehen. So Ihre Frage ist nicht gültig Frage für UT. – PiotrNycz

+0

Mit anderen Worten - Sie sollten Tests für Fall schreiben, wenn diese Sequenz einmal passiert, anderen Testfall, wenn diese Sequenz zweimal usw. passiert ... – PiotrNycz

Antwort

0

ich schon erwähnt, in den Kommentaren, dass dies nicht wirklich gute Idee ist, Unit-Tests zu schreiben, wo man nicht die volle Kontrolle oder Wissen über haben kann, was wirklich geschehen Dort.

Aber wie auch immer dies machbar ist - z.B. Sie können Lambda aufrufen, die jedes Mal nächste Ergebnis führt es heißt:

auto valueGenerator = [idx=0, arr={2,40,7}]() mutable 
{ 
    auto result = *std::next(std::begin(arr), idx); 
    idx = (idx + 1) % arr.size(); 
    return result ; 
}; 
EXPECT_CALL(....).WillRepeatedly(Invoke(valueGenerator)); 

Wenn Sie dies beendet ist nicht in der Mitte der Sequenz überprüfen muss - tun, um diese Art und Weise:

int idx = 0; 
auto valueGenerator = [&idx, arr={2,40,7}]() 
{ 
    auto result = *std::next(std::begin(arr), idx); 
    idx = (idx + 1) % arr.size(); 
    return result ; 
}; 
EXPECT_CALL(....).WillRepeatedly(Invoke(valueGenerator)); 

/// Prossible in TearDown - or at the very end of test: 
ASSERT_EQ(0, idx); 
Verwandte Themen