2017-06-12 2 views
3

Ce fait suite à ma dernière question:cadre GoogleTest semble ne pas fonctionner avec des fonctions Lambda (suivi)

Google Test macros seem not to work with Lambda functions

La solution mentionnée dans ce cas, a travaillé pour ce cas particulier, à savoir la Le constructeur d'une classe template à l'intérieur du lambda pourrait être enveloppé dans des parenthèses et la construction réussirait. Et j'ai accepté cette réponse. Mais la question demeure toujours, que le cadre de GoogleTest semble ne pas fonctionner avec des fonctions de Lambda. Je ne vois rien à ce sujet dans la documentation.

J'ai fait le test suivant,

TEST(errorhandlingInterpolator, NOTtoolargeInput) { 
    ASSERT_NO_THROW(throw); 
} 

qui provoquerait l'échec du test. Bien.

Puis, je l'ai fait,

TEST(errorhandlingInterpolator, NOTtoolargeInput) { 
     ASSERT_NO_THROW([](){throw;}); 
} 

qui provoquerait le test de ne pas échouer. Étrange. Donc, pour être finalement complet (quelque chose de si trivial), j'ai testé le bit suivant.

void dummy() { throw; } 

TEST(errorhandlingInterpolator, NOTtoolargeInput) { 
     ASSERT_NO_THROW(throw); 
} 

et l'exception a provoqué l'échec du test. Tout bon.

Qui a soulevé un drapeau dans ma tête, faire des exceptions même travailler avec des fonctions lambda. Je pensais qu'ils étaient comme des fonctions normales, sauf anonymes. Apparemment, ils le font. Les deux questions suivantes en parlent.

Can C++ lambda-expression throw?

throw an exception from a lambda expression, bad habit?

Ainsi, il ne semble vraiment faire bouillir au fait que les macros dans le cadre de tests Google ne fonctionnent pas avec les fonctions lambda.

Répondre

3

L'expression ASSERT_NO_THROW([](){throw;}) n'exécute pas d'exception, elle déclare simplement un lambda, qui est ensuite supprimé, car il n'est affecté à rien.

Vous voulez ASSERT_NO_THROW([](){throw;}()), qui tente immédiatement d'exécuter le lambda.

+0

Je veux pleurer. Je ne connaissais pas assez mes lambdas et je suis allé japper à propos de quelque chose sans rapport. : '( –

+0

yup! Semble légitime.C'était le problème.Merci! –