Передать параметр метода в действие в googlemock - PullRequest
3 голосов
/ 07 марта 2012

Я использую Gmock для вызова метода, который возвращает элемент QList heightsFromCsvResult в качестве параметра out. Вот рабочий код:

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 удовлетворен.

Кто-нибудь видит проблему в коде?

1 Ответ

4 голосов
/ 07 марта 2012

Использование переменной, установленной с помощью SaveArg в том же EXPECT_CALL , похоже, не работает, вместо этого вы можете выполнить пользовательское действие который устанавливает второй аргумент, используя аргумент 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 для чего-то еще, вы можете удалить эту часть.

...