2015-10-12 4 views
0

Je voudrais déclencher une action etReturn quelque chose sur .WillRepeatedly() dans googlemock.Puis-je retourner et déclencher une action, par ex. incrémenter un compteur avec .WillRepeatedly?

Est-ce que quelqu'un sait comment le faire? (L'écriture est une fonction qui incrémente un paramètre référencé et retourner ce que je veux est la seule option ici?)

Ce sont mes tentatives infructueuses de le faire:

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:

Afin kerrek mentionné que j'ai essayé:

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

mais je reçois des erreurs comme:

/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

Je pensais que cela aiderait, mais s'il vous plaît vérifier mon édition – Patryk

+1

Ah, attendez, «Invoke» ne peut être utilisé pour déléguer à une autre fonction du même type. Ce n'est pas la même chose que "appeler n'importe quel code". Peut-être faire une fonction personnalisée du type correct qui incrémente le compteur, puis appelle le simulacre? 'std :: string myFn (chaîne const & nom) {++ compteur; return getTemplateFileName (nom); } '? Puis juste 'WillRepeatedly (Invoke (..., ... :: myFn))'. –

Répondre

1

Vous pouvez utiliser DoAll comme Kerrek suggère dans les commentaires à l'aide InvokeWithoutArgs.

Une autre alternative est de créer une fonction personnalisée pour effectuer les deux actions d'une manière très simple en utilisant un lambda.

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