C++ GMock SetArgReferee как CStringArrayC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 C++ GMock SetArgReferee как CStringArray

Сообщение Anonymous »

Используя C++11 с MFC и пытаясь создать модульные тесты с помощью gtest 1.7, я столкнулся с проблемой. Я хочу высмеять неприятный метод, не меняя объявления или определения метода ниже:

Код: Выделить всё

virtual bool  getValue(CStringArray& valueOut) const;    // reading from database
Издеваться просто, MOCK_CONST_METHOD1(getValue,bool(CStringArray&)); сделает это за меня. Однако, используя его в тестовом примере, я не могу его скомпилировать.

Соответствующая часть тестового примера:

Код: Выделить всё

CStringArray localArray;
localArray.Add("Only One Element");
EXPECT_CALL(object, getValue(_)).WillOnce(DoAll(
SetArgReferee(localArray),
Return(true)
));
Это приводит к ошибке компиляции, поскольку CStringArray (как производный от CObject) является объектом, который нельзя копировать и перемещать. Мой вопрос:

Как я могу изменить возвращаемый массив, используя только фиктивные функции?
Я знаю, что могу создать гибридный макет с реальной функцией, создающей массив, но мне было бы сложнее добавлять собственные элементы в каждый тестовый пример. Что-то вроде:

Код: Выделить всё

struct MockNastyObject : public NastyObject {
MOCK_CONST_METHOD1(getValueMock, bool(CStringArray&));
virtual bool getValue(CStringArray& arr) const override{
arr.Add("Element1");
getValueMock(arr);
}
};
Этот подход может сработать, поскольку я могу установить ожидание для getValueMock и изменить массив с помощью не-макетного метода.

Подробнее здесь: https://stackoverflow.com/questions/724 ... tringarray
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»