gmock раздает ссылку на параметр с удаленным конструктором - PullRequest
1 голос
/ 07 февраля 2020

Я пытаюсь сослаться на аргумент out смоделированного метода getData. Моя проблема в том, что «ControlData» не имеет конструктора копирования, потому что он был удален. Насколько я понимаю, «SetArgReferee» создает промежуточный объект перед передачей его по ссылке.

MOCK_METHOD1(getData, void(ControlData& par_rcl_ControlData));

ControlData loc_data;

EXPECT_CALL(loc_cl_control, getData(_)).WillOnce(SetArgReferee<0>(loc_data));

Я попытался создать пользовательское действие, например:

ACTION_P(SetArgRef, obj) { arg0 = &obj; }

Но к сожалению это тоже не компилируется. Как я могу передать объект непосредственно по проверенному методу?

1 Ответ

0 голосов
/ 11 февраля 2020

Форма цитирования GoogleMock Кулинарная книга :

SetArgPointee() удобно создает внутреннюю копию передаваемого ей значения, устраняя необходимость сохранять значение в области видимости и живой. Однако это означает, что значение должно иметь конструктор копирования и оператор присваивания.

Предположительно, то же самое относится и к SetArgReferee. Это означает, что вам нужно специальное действие для перемещения объекта в эту ссылку (без использования конструктора копирования в любом месте).

К счастью, позже есть предложение:

, но как мы работаем с методами, принимающими аргументы только для перемещения? Ответ в том, что они работают нормально, хотя некоторые действия не будут компилироваться, если какой-либо из аргументов метода только для перемещения. Вы всегда можете использовать Return или лямбду или функтор:

Вам потребуется лямбда (или любой объект функции), который передаст аргумент при перемещении:

ControlData loc_data;

auto SetArgByMove = [&loc_data](auto& arg){arg = std::move(loc_data);};
EXPECT_CALL(loc_cl_control, getData(_)).WillOnce(Invoke(SetArgByMove));

This следует скомпилировать и запустить без проблем.


Возможно, вы также можете выполнить пользовательское действие, но не с помощью макроса ACTION_P - он также создает копию объекта. Вам нужно будет написать полноценное действие, создав класс, наследующий от ActionInterface

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...