ASSERT TRUE () le type de retour ne correspond pas au type de fonction dans gtest

quand j'utilise ASSERT_TRUE() condition Gtest je suis en dessous de l'erreur. return type does not match function type avec un soulignement dans VS 2010..

abc.h

#include "gtestgtest.h"

class abc {
pubilc:
    bool fun();
    private:
    bool fun1();
};

abc.c

bool abc::fun()
{
    ASSERT_TRUE(fun1()); // Getting error: return type does not match function type
}

bool abc::fun1()
{
    return true; // True or false depanding on operation
}
8
demandé sur Bill Lynch 2012-09-27 13:07:04

3 réponses

Il n'y a pas de return déclaration spécifiée dans fun() mais il renvoie un bool. Ajouter un return false; ou return true;fun() ou changer son type de retour en void:

void abc::fun()
{
    ASSERT_TRUE(fun1());
}

basé sur Mon compilateur se plaint qu'un constructeur (ou destructeur) ne peut pas retourner de valeur. Ce qui se passe? qui stipule (textuellement):

en raison d'une particularité de C++, afin de supporter la syntaxe de diffusion des messages à un ASSERT_*, par exemple

ASSERT_EQ(1, Foo()) << "blah blah" << foo;

nous avons dû abandonner L'utilisation D'ASSERT* et FAIL* (mais pas D'EXPECT* et ADD_FAILURE*) dans les constructeurs et les destructeurs. La solution est de déplacer le contenu de votre constructeur/destructeur vers une fonction privée de membre de void, ou de passer à EXPECT_*() si cela fonctionne. Cette section du guide de l'utilisateur, l'explique.

return doit être void dans les fonctions qui utilisent des ASSERT_*() macros.

1
répondu hmjd 2016-03-04 11:46:41

ASSERT_TRUE est une macro. Une fois élargi, il contiendra une branche comme:

if (fun1() == false) {
   return;
}

c'est de Cette façon ASSERT_TRUE fait un arrêt sur l'échec, mais il signifie également que votre méthode bool abc::fun() a maintenant un void chemin de sortie de retour, en conflit avec sa signature.

les correctifs possibles incluent ne pas utiliser les affirmations de stop:

bool abc::fun(){
    bool result = fun1();
    EXPECT_TRUE(result); //No return in expansion
                         //No hard stop!
    return result;
}

ou modifier vos méthodes de type de retour si pas besoin:

void abc::fun(){
    ASSERT_TRUE(fun1()); //Hard stop on failure
}

ou retour par la référence:

void abc::fun(bool &outResult){
   outResult = fun1();  //return result by reference
   ASSERT_TRUE(result);
}
14
répondu Downward Facing God 2015-02-18 11:21:10

fun méthode bool type de retour pour qu'il ait encore besoin de return quelque chose.

ASSERT_TRUE est une macro qui teste que quelque chose est vrai, elle n'appellera pas Retour pour vous. En fait, vous pouvez en avoir beaucoup!--4--> dans une rangée, et (à condition qu'ils soient tous vrais) ils vont tous exécuter l'un après l'autre. Pensez à l' ASSERT_TRUE macro comme appel de fonction, même si ce n'est pas techniquement.

Cela devrait fonctionner:

bool abc::fun()
{
   ASSERT_TRUE(fun1()); 
   return true;
}
1
répondu Adam M-W 2012-09-27 09:10:14