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