我可以 Return 并触发一个动作吗?用 .WillRepeatedly 增加一个计数器?
Can I Return and trigger an action e.g. increment a counter with .WillRepeatedly?
我想触发一个动作 AND Return
在 googlemock
上 .WillRepeatedly()
的东西。
有人知道怎么做吗? (正在编写一个将增加引用参数的函数,而 return 我想要的是这里唯一的选择吗?)
这是我失败的尝试:
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));
编辑:
正如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
您可以使用 DoAll
,正如 Kerrek 在评论中建议的那样,使用 InvokeWithoutArgs
。
另一种方法是创建一个自定义函数,使用 lambda 以非常直接的方式执行这两个操作。
EXPECT_CALL(parser, getTemplateFileName(_))
.WillRepeatedly(InvokeWithoutArgs([&]()
{
parser.counter++;
return TEMPLATE_NAME;
});
我想触发一个动作 AND Return
在 googlemock
上 .WillRepeatedly()
的东西。
有人知道怎么做吗? (正在编写一个将增加引用参数的函数,而 return 我想要的是这里唯一的选择吗?)
这是我失败的尝试:
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));
编辑:
正如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
您可以使用 DoAll
,正如 Kerrek 在评论中建议的那样,使用 InvokeWithoutArgs
。
另一种方法是创建一个自定义函数,使用 lambda 以非常直接的方式执行这两个操作。
EXPECT_CALL(parser, getTemplateFileName(_))
.WillRepeatedly(InvokeWithoutArgs([&]()
{
parser.counter++;
return TEMPLATE_NAME;
});