2015-10-12 3 views
0

Я хотел бы вызвать действие ИReturn что-то на .WillRepeatedly() в googlemock.Могу ли я вернуться и вызвать действие, например. увеличивать счетчик с помощью .WillRepeatedly?

Кто-нибудь знает, как это сделать? (Пишет функцию, которая будет приращение ссылается параметр и вернуть то, что я хочу, это единственный вариант здесь?)

Это мои неудачные попытки сделать так:

EXPECT_CALL(parser, getTemplateFileName(_)) 
    .WillRepeatedly(Invoke(parser.counter++), Return(TEMPLATE_NAME)); 

class TemplateParser: public Parser 
{ 
    public: 
     MOCK_METHOD1(getTemplateFileName, std::string(const string& name)); 

     void incrementCounter() 
     { 
      ++counter; 
     } 
}; 

// ... 

EXPECT_CALL(parser, getTemplateFileName(_)) 
    .WillRepeatedly(Invoke(&parser, &TemplateParser::incrementCounter), 
        Return(TEMPLATE_NAME)); 

EDIT:

Итак, как kerrek упоминалось я попытался это:

EXPECT_CALL(parser, getTemplateFileName(_)) 
    .WillRepeatedly(DoAll(
        Invoke(&parser, &TemplateParser::incrementCounter), 
        Return(TEMPLATE_NAME) 
         ) 
       ); 

Но я получаю ошибки, как:

/opt/gmock-1.7.0/include/gmock/gmock-more-actions.h:80: instantiated from ‘Result testing::internal::InvokeMethodAction<Class, MethodPtr>::Perform(const ArgumentTuple&) const [with Result = void, ArgumentTuple = std::tuple<const std::string&>, Class = TemplateParser, MethodPtr = unsigned int (TemplateParser::*)()]’ 
/opt/gmock-1.7.0/include/gmock/gmock-actions.h:371: instantiated from ‘typename testing::internal::Function<F>::Result testing::PolymorphicAction<Impl>::MonomorphicImpl<F>::Perform(const typename testing::internal::Function<F>::ArgumentTuple&) [with F = void(const std::string&), Impl = testing::internal::InvokeMethodAction<TemplateParser, unsigned int (TemplateParser::*)()>]’ 
test/src/ParserTest.cpp:315: instantiated from here 
/opt/gmock-1.7.0/include/gmock/gmock-generated-actions.h:83: error: too many arguments to function 
/opt/gmock-1.7.0/include/gmock/gmock-generated-actions.h:83: error: return-statement with a value, in function returning 'void' 
make: *** [test/obj/ParserTest.o] Error 1 
+1

'WillRepeatedly (DoAll (...))'? –

+0

Я думал, что это поможет, но, пожалуйста, проверьте мое редактирование. – Patryk

+1

А, подождите, 'Invoke' может использоваться только для делегирования другой функции того же типа. Это не то же самое, что просто «вызов какого-либо кода». Может быть, создать пользовательскую функцию правильного типа, которая увеличивает счетчик, а затем вызывает макет? 'std :: string myFn (const string & name) {++ counter; return getTemplateFileName (имя); } '? Затем просто 'WillRepeatedly (Invoke (..., ... :: myFn))'. –

ответ

1

Вы можете использовать DoAll в Kerrek предлагает в комментариях с помощью InvokeWithoutArgs.

Другой альтернативой является создание пользовательской функции для выполнения обоих действий очень простым способом с использованием лямбда.

EXPECT_CALL(parser, getTemplateFileName(_)) 
    .WillRepeatedly(InvokeWithoutArgs([&]() 
             { 
              parser.counter++; 
              return TEMPLATE_NAME; 
             });