2012-03-07 49 views
3

我使用Gmock進行方法調用,該方法調用返回QList heightsFromCsvResult的元素作爲輸出參數。這裏是當前工作的代碼:將方法參數傳遞給googlemock中的操作

EXPECT_CALL(*_mockAttributeRepository, getGeometryHeightValues(_,_)) 
    .WillOnce(DoAll(SetArgReferee<1>(heightsFromCsvResult.at(0)), Return(true))) 
    .WillOnce(DoAll(SetArgReferee<1>(heightsFromCsvResult.at(1)), Return(true))) 
    .WillOnce(DoAll(SetArgReferee<1>(heightsFromCsvResult.at(2)), Return(true))) 
    .WillOnce(DoAll(SetArgReferee<1>(heightsFromCsvResult.at(3)), Return(true))); 

第一個參數從LINENUMBER

getGeometryHeightValues(int lineNumber, QPair<QString, QString>) 

用於heightsFromCsvResult.at(LINENUMBER)的索引。

現在,我嘗試在更通用的方式來使用Gmock:

int* mockLineNumber = new int; 
EXPECT_CALL(*_mockAttributeRepository, getGeometryHeightValues(_,_)) 
    .Times(4) 
    .WillRepeatedly(DoAll(SaveArg<0>(mockLineNumber), SetArgReferee<1>(heightsFromCsvResult.at(*(mockLineNumber))), Return(true))); 

但是這個代碼不工作,因爲mockLineNumber從未被Gmock寫的。但是EXPECT_CALL得到滿足。

有沒有人在代碼中看到問題?

回答

4

使用相同的EXPECT_CALL內設置的變量,與SaveArg似乎並不奏效,你可以做的反而是要經過自定義操作,設置使用參數0作爲指數的第二個參數通過的容器。

ACTION_P(SetArg1WithValueFromPassedArgumentUsingArg0AsIndex, param) 
{ 
    arg1 = param.at(arg0); 
} 

int* mockLineNumber = new int; 
EXPECT_CALL(*_mockAttributeRepository, getGeometryHeightValues(_,_)) 
    .Times(4) 
    .WillRepeatedly(DoAll(SaveArg<0>(mockLineNumber), SetArg1WithValueFromPassedArgumentUsingArg0AsIndex(heightsFromCsvResult), Return(true))); 

除非你需要mockLineNumber別的東西,你可以刪除該部分。