我想在Return中的.WillRepeatedly()上触发一个动作并googlemock进行操作。

有人知道怎么做吗? (正在编写一个将递增引用的参数并返回我想要的功能的函数,这是这里的唯一选择吗?)

这是我这样做的失败尝试:

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

最佳答案

您可以按照Kerrek在使用DoAll的注释中建议的方式使用InvokeWithoutArgs

另一种选择是使用lambda创建一个自定义函数,以非常直接的方式执行这两个动作。

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

关于c++ - 我可以退货并触发 Action 吗?会增加一个计数器。,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33085450/

10-11 23:11
查看更多