2015-12-18 2 views
3
virtual void doSomething(std::function<void(std::error_code result)> callback) = 0 

MockMethod1(doSomething, std::function<void(std::error_code result)> callback); 

Теперь, когда я пишу EXPECT_CALL, как я могу назвать «обратный вызов»Как вызвать указатель функции, который передается методу Mock?

EXPECT_CALL(object, doSomething(testing::_)).WillRepeatedly(???); 

То, что я должен написать на то, чтобы назвать свою функцию обратного вызова?

+0

Нет отзывов? Вам удалось решить вашу проблему? –

ответ

2

Не нужно выполнять индивидуальные действия.

я нашел ответ, как другие, вот что вам нужно сделать,

EXPECT_CALL (.....). WillRepeatedly (тестирование :: InvokeArgument < 1> (arg1, arg2, ..));

1

Используйте специальные действия для достижения этого. Чтобы добиться большей гибкости, я предлагаю создать шаблон для действия, где параметр шаблона означает индекс аргумента функции обратного вызова в doSomething. Вот как вы это делаете:

ACTION_TEMPLATE(ExecuteCallback, HAS_1_TEMPLATE_PARAMS(unsigned, uIndex), AND_1_VALUE_PARAMS(callbackArg)) 
{ 
    (std::get<uIndex>(args))(callbackArg); 
} 

Обратите внимание, что при необходимости вы можете добавить дополнительные значения параметров. Теперь, в ходе теста вы вызываете установочные макетные вызовы следующим образом:

EXPECT_CALL(object, doSomething(testing::_)).WillRepeatedly(DoAll(ExecuteCallback<0>(err), Return())); 
+0

Спасибо, это тоже отлично – user2317738

+0

@ user2317738 Добро пожаловать! Рассмотрите возможность ответа, если считаете, что это полезная альтернатива. Ура! :) –

+0

Спасибо @Marko, upvoted ... внутри InvokeArgument используйте ту же самую вещь, которую вы описали. – user2317738