GTest - передать параметр фиктивной функции в ASSIGN () - PullRequest
0 голосов
/ 18 декабря 2018

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

Таким образом, мой параметр 4 является входом, который «записывается» в мое фиктивное оборудование (regStorage)переменная).
В основном мое ожидание Mock выглядит следующим образом

EXPECT_CALL(cAdapterMock, ReadByPort(_, _, _, _, _))              
        .Times(1)
        .WillRepeatedly(DoAll(::testing::Assign(&regStorage, WHAT-DO-I-PUT-HERE-TO-GET-ARG4-THAT-CAME-INTO-READ-BY-PORT),::testing::Return(0)));

Я пытаюсь выяснить, как я получаю arg4, который поступил в ReadByPort, чтобы я мог поместить его во второй параметр Assign, чтобы получитьон вставил в regStorage.

Я успешно использовал макрос ACTION для получения значения arg4, но это кажется действительно глупой механикой, поэтому я предполагаю, что должен быть более простой способ.

ACTION(GetWrittenMauiRegister) { return arg4; }
EXPECT_CALL(cAdapterMock, ReadByPort(_, _, _, _, _))              // #3
            .Times(1)
            .WillRepeatedly(DoAll(::testing::Assign(&regStorage, (UINT32)GetWrittenMauiRegister),::testing::Return(0)));

Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Я обнаружил, что решение заключается в использовании SaveArg (указатель), где N - аргумент, а указатель - переменная, для которой вы также хотите сохранить аргумент.

0 голосов
/ 18 декабря 2018

Один из них - использовать Invoke. Как уже упоминалось в GMOCK - как изменить аргументы метода, если тип возвращаемого значения недействителен

ProxyReadByPort(arg1, arg2, arg3, arg4) {
   ::testing::Assign(...., arg2);
   return 0;
}

EXPECT_CALL(cAdapterMock, ReadByPort(_, _, _, _, _)
   .WillOnce(Invoke(ProxyReadByPort))

BTW, Times (1) и WillRepeatedly() работает, однако, не очень хорошо, используйте вместо этого WillOnce.

...