2016-06-07 17 views
4

Ich versuche, etwas Schlaf innerhalb .WillOnce vor dem Aufruf von FuncHelper. Also brauche ich etwas Ähnliches wie die folgenden:sleep() rufen Sie innerhalb von gmocks EXPECT_CALL

EXPECT_CALL(*_mock, Func(_,_,_)).Times(1) 
    .WillOnce(DoAll(InvokeWithoutArgs(sleep(TimeToSleep)), 
        Invoke(_mock, &M_MyMock::FuncHelper))); 

Ist es möglich, mit einem arg innerhalb .DoAll sleep() zu nennen? C++ 98 ist bevorzugt.

UPD:

Die Lösung auf @Smeeheey Antwort basiert und verwendet C++ 98.

template <int N> void Sleep() 
{ 
    sleep(N); 
} 
... 
EXPECT_CALL(*_mock, Func(_,_,_)).Times(1) 
    .WillOnce(DoAll(InvokeWithoutArgs(Sleep<TimeToSleep>), 
        Invoke(_mock, &M_MyMock::FuncHelper))); 
+0

Es ist nicht notwendig, eine eigene Funktion zu definieren, verwenden Sie einfach, was STL zu bieten hat. Siehe meine Antwort, hoffe es hilft! –

Antwort

3

Da Sie die C++ 98 ist bevorzugt eher als obligatorisch, ich werde zuerst eine schöne saubere C++ 11 Antwort geben:

EXPECT_CALL(*_mock, Func(_,_,_)).Times(1) 
    .WillOnce(DoAll(InvokeWithoutArgs([TimeToSleep](){sleep(TimeToSleep);}), 
        Invoke(_mock, &M_MyMock::FuncHelper))); 

Im anderen Fall (für C++ 98

void sleepForTime() 
{ 
    sleep(TimeToSleep); 
} 

Und dann:), eine Wrapper-Funktion an anderer Stelle im Code definiert

EXPECT_CALL(*_mock, Func(_,_,_)).Times(1) 
    .WillOnce(DoAll(InvokeWithoutArgs(sleepForTime), 
        Invoke(_mock, &M_MyMock::FuncHelper))); 

Beachten Sie, dass TimeToSleep eine globale Variable sein muss.

EDIT: Wie pro Vorschlag von OP in den Kommentaren, wenn TimeToSleep eine Kompilierung-Konstante ist, können Sie die globale Variable vermeiden:

template <int Duration> 
void sleepForTime() 
{ 
    sleep(Duration); 
} 

... 

EXPECT_CALL(*_mock, Func(_,_,_)).Times(1) 
    .WillOnce(DoAll(InvokeWithoutArgs(sleepForTime<TimeToSleep>), 
        Invoke(_mock, &M_MyMock::FuncHelper))); 
+0

Ich wollte keine globale Variable verwenden, um Tests flexibel zu halten. Ihre Antwort schlägt jedoch eine andere Lösung vor. Danke)) Ich würde eine Template-Funktion mit einem Wertparameter erstellen. "Vorlage void Schlaf() {Schlaf (N);}" Es würde mein Problem lösen. – Rom098

+0

Oh ja, ich wusste nicht, dass 'TimeToSleep' eine Kompilierzeitkonstante ist. Ich habe die Antwort aktualisiert, um diesen Vorschlag zu übernehmen. – Smeeheey

1

Wenn Sie 98 Lösung C++ bevorzugen, würde ich vorschlagen mit std::bind1st:

EXPECT_CALL(*_mock, Func(_,_,_)).Times(1) 
    .WillOnce(DoAll(InvokeWithoutArgs(std::bind1st(sleep, TimeToSleep)), 
        Invoke(_mock, &M_MyMock::FuncHelper))); 
+0

Ich fürchte, dass 'std :: bind 'kein Teil von C++ 98 Standard ist. – Rom098

+1

Sie könnten versuchen, 'std :: bind1st' - das war C++ 98 Lösung - siehe http://en.cppreference.com/w/cpp/utility/functional/bind12 Aber Sie müssen sich beeilen - es ist bereits seit C veraltet ++ 11 - wird in C++ gelöscht 17 ... – PiotrNycz

+0

@ Rom098 Ich habe vergessen, dass es nur "bind1st" und "bind2nd" in C++ 98 gab. Ich habe meine Antwort aktualisiert, um 'bind1st' zu verwenden. –