2016-08-08 20 views
2

Dies ist, was ich erreichen möchte. In meinem Testgerät möchte ich eine Hilfsfunktion mit einem Parameter n aufrufen, um dem Testgerät mitzuteilen, wie viele Initialisierungssequenzen erwartet werden. Einige in den Sequenzen verwendete Parameter sind in drei std::vector Behältern gespeichert; fileDescriptor, handle, selectionObject.Hinzufügen erwarteter Anrufe in einer Schleife

Was ich geschrieben habe, ist dies:

void MyTest::init_Ok(uint32_t n) 
{ 
    for (uint32_t i = 0; i < n; ++i) 
    { 
    fileDescriptor.push_back(i); // FDs starting at 0 
    handle.push_back(reinterpret_cast<void*>(18 + i)); // handles starting at 18 
    selectionObject.push_back(555 + i); // SOs starting at 555 

    EXPECT_CALL(MyMockApi::getApi(), initialize(Pointee(nullptr), StrEq("InitString"), MyMatcher())) 
     .WillOnce(DoAll(SetArgPointee<0>(handle[i]), 
         Return(INIT_OK))); 
    EXPECT_CALL(MyMockApi::getApi(), selectionObjectGet(handle[i], Pointee(nullptr))) 
     .WillOnce(DoAll(SetArgPointee<1>(selectionObject[i]), 
         Return(SELECTION_OK))); 
    EXPECT_CALL(MyMockApi::getApi(), finalize(handle[i])) 
     .WillOnce(Return(FINAL_OK)); 
    } 
} 

Ich weiß, warum es nicht funktioniert. Es wird erwartet, dass alle Aufrufe an initialize identisch sind, aber ich möchte noch verschiedene Aktionen (Parameter abhängig vom Schleifenzähler i) für den ersten, zweiten, dritten, ..., n-ten Aufruf durchführen. Die aktuelle Implementierung erwartet nur einen Aufruf an initialize egal Parameter n. Ist es möglich, dies zu beheben und es irgendwie eine Schleife zu halten, oder muss ich die Aktionen mit einer WillOnce Zeile für jede i hinzufügen? Dies würde bedeuten, dass ich n überprüfen und unterschiedliche Anzahl von WillOnce Zeilen für verschiedene mögliche Werte von n hinzufügen muss, die ich wirklich vermeiden möchte.

Antwort

2

Eine Möglichkeit könnte sein, Invoke zu verwenden. Sie können eine Funktion schreiben, die Zugriff auf den Container handles und eine laufende Variable member/static hat (zB counterVar), die angibt, wie oft die Funktion aufgerufen wurde. Basierend auf dem Wert von counterVar können Sie die Logik bestimmen.

.WillRepeatedly(Invoke(<your function>)) 

Etwas wie:

EXPECT_CALL(MyMockApi::getApi(), initialize(Pointee(nullptr), StrEq("InitString"), MyMatcher())) 
     .WillRepeatedly(Invoke(successfulInitialize)); 

ReturnCode successfulInitialize(void* op, std::string msg) 
{ 
    static int counterVar = 0; 
    *op = handles[counterVar++]; 
    return INIT_OK; 
} 
+0

Danke, ich habe endlich diese an die Arbeit – Martin