Как игнорировать первое действие в gtest DoAll ()

Объявляю функцию

void MyFunction(const std::wstring& inParameter, std::wstring& outParamater);

Первый параметр - это переданный параметр, второй - параметр выходного значения, значение, которое я хочу получить с помощью функции, передаст его с помощью outParameter.

Теперь я Gmock это

MOCK_METHOD2(MyFunction, void(const std::wstring&, std::wstring&));

Однако, когда я использую эту фиктивную функцию:

std::wstring firstStr = L"firstStr";
std::wstring test = L"test";
EXPECT_CALL(*myGmockInstance, MyFunction(firstStr, _)).Times(1).WillOnce(DoAll(firstStr, SetArgReferee<1>(test)));

Не работает.

Я тоже пробовал

EXPECT_CALL(*myGmockInstance, MyFunction(_, _)).Times(1).WillOnce(DoAll(_, SetArgReferee<1>(test)));

или же

EXPECT_CALL(*myGmockInstance, MyFunction(_, _)).Times(1).WillOnce(DoAll(firstStr, SetArgReferee<1>(test)));

или же

EXPECT_CALL(*myGmockInstance, MyFunction(_, _)).Times(1).WillOnce(DoAll(SetArgReferee<0>(firstStr), SetArgReferee<1>(test)));

Я понимаю, что inParameter - это const, поэтому я не могу использовать для него SetArgReferee. Но как установить его значение и одновременно я могу установить значение для outParameter?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 141
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что название вашего вопроса вводит в заблуждение. Насколько я понимаю, вы просто хотите присвоить какое-то произвольное значение второму аргументу вашей функции (выходному аргументу). Вот как это можно сделать с помощью Invoke:

using ::testing::_;

void assignStringToArg(const std::wstring&, std::wstring& outputStr,
    const std::wstring expectedStr) {
    outputStr = expectedStr;
}

class SomeMock {
public:
    MOCK_METHOD2(MyFunction, void(const std::wstring&, std::wstring&));
};

TEST(xxx, yyy) {
    SomeMock someMock;
    std::wstring firstStr(L"aaabbbccc");
    std::wstring secondStr(L"I should change upon MyFunction call ...");
    std::wstring expectedSecondStr(L"xxxyyyzzz");
    EXPECT_CALL(someMock, MyFunction(firstStr, _)).Times(1).WillOnce(Invoke(std::bind(
        &assignStringToArg,
        std::placeholders::_1,
        std::placeholders::_2,
        expectedSecondStr)));
    someMock.MyFunction(firstStr, secondStr);
    ASSERT_EQ(expectedSecondStr, secondStr);
}

Обратите внимание, что функция, предоставляемая Invoke, должна иметь ту же сигнатуру, что и функция, которую вы ожидаете вызвать (вот почему я использую bind). Вы можете добиться того же результата, используя макрос Google ACTION_P. Я предпочитаю использовать Invoke только потому, что мне он кажется более чистым.

Поскольку ваш случай довольно прост, вы также можете сделать это с помощью SetArgReferee, как вы пробовали раньше:

    EXPECT_CALL(someMock, MyFunction(firstStr, _)).Times(1).WillOnce(
        SetArgReferee<1>(L"something"));
    someMock.MyFunction(firstStr, secondStr);
    ASSERT_EQ(L"something", secondStr);

Я просто не вижу смысла использовать DoAll, если вы хотите сделать только одно действие. Но ... если вы действительно настаиваете:

    EXPECT_CALL(someMock, MyFunction(firstStr, _)).Times(1).WillOnce(
        DoAll(SetArgReferee<1>(L"something1"), SetArgReferee<1>(L"something2")));
    someMock.MyFunction(firstStr, secondStr);
    ASSERT_EQ(L"something2", secondStr);

Это довольно глупый пример, потому что он устанавливает выходную переменную на L"something1", а затем сразу на L"something2".

Другие вопросы по теме