2014-08-28 1 views
3

J'ai un test dans un projet que j'ai hérité qui ressemble à cegtest et GoogleMock EXPECT_CALL échoue dans les fenêtres, passe sur Mac avec char * param

std::string value("test string"); 
const char * buffer = value.c_str(); 
EXPECT_CALL(object, foo(_,_,buffer, buffer.size(), _)).WillOnce(Return(0)); 
bar(value); 

Le tampon est un char * pointe vers une chaîne de données. J'ai inséré des valeurs factices comme objet juste pour se concentrer sur le problème qui semble être dans l'utilisation de EXPECT_CALL. Juste après cette EXPECT_CALL, une barre de méthode est appelée qui prend la valeur de chaîne d'origine en tant que paramètre, puis, dans la méthode, appelle foo avec un tampon construit à partir de la valeur de chaîne d'origine.

Ce test fonctionne sur la version Mac de ce projet, mais échoue sur la version Windows. Il semble comparer les adresses de pointeur pour les deux pointeurs char, attendus et réels, et échouer parce qu'ils sont différents. La méthode foo est définitivement appelée dans la barre.

Si cette méthode de test (EXPECT_CALL) compare les adresses des pointeurs et non les données de ce pointeur, le test ne devrait-il pas également échouer sur Mac?

Quelqu'un connaît-il une différence distincte entre Mac et Windows lors de l'utilisation de EXPECT_CALL et de pointeurs?

erreur je vois

unknown file: error: 
Unexpected mock function call - returning default value. 
    Function call: foo(NULL, 1, 0000000001CAAE78 pointing to "test string", 11,_) 
      Returns: 0 
Google Mock tried the following 1 expectation, but it didn't match: 

test.cpp(235): EXPECT_CALL(object, foo(_,_,buffer,buffer.size(),_)... 
    Expected arg #2: is equal to 0000000001CAAF78 pointing to "test string" 
      Actual: 0000000001CAAE78 pointing to "test string" 
     Expected: to be called once 
      Actual: never called - unsatisfied and active 
    test.cpp(235): error: Actual function call count doesn't match EXPECT_CALL(object, foo(_,_,buffer, buffer.size(), _)... 
    Expected: to be called once 

J'ai modifié cette erreur juste pour refléter mon exemple.

Merci d'avance pour votre aide.

+0

'char * buffer = valeur.c_str();' ne devrait pas compiler. – chris

+0

corrigé pour être const char * buffer = value.c_str(). Conçu pour être plus de pseudo code que complet sur le code désolé pour l'erreur. – astaubin

+1

Vous n'êtes pas sûr de la différence Mac/Windows par rapport à EXPECT_CALL. Peut-être aussi comment différent compilateur traiter les chaînes constantes. Quoi qu'il en soit, si c'est la valeur de la chaîne qui vous intéresse, il vaut mieux utiliser 'foo (_, _, testing :: StrEq (buffer),' ... (qui fonctionne sous Windows) – SleuthEye

Répondre

4

Il ne semble pas y avoir de différences évidentes entre Mac & Windows par rapport à EXPECT_CALL. Je suppose qu'il pourrait y avoir aussi des différences entre l'implémentation string, et comment les compilateurs traitent les chaînes constantes, ce qui pourrait expliquer la différence de comportement.

Cependant, je m'attendrais à ce que les arguments de pointeur soient comparés par la comparaison d'adresse. Pour comparer les valeurs, vous devez utiliser le code Matchers spécifique. En particulier pour votre cas, il existe une variété de String Matchers à choisir, y compris StrEq pour l'égalité des cordes, que vous pouvez utiliser comme:

EXPECT_CALL(object, foo(_,_,testing::StrEq(buffer),value.size(),_)) 
    .WillOnce(Return(0)); 
1

La raison pour laquelle cela fonctionne sous Windows est parce que MSVC implémente la mise en commun chaîne (/GF) . Voir ici:

http://msdn.microsoft.com/en-us/library/s0s0asdt.aspx

Alors, pourquoi cela fait-il? Parce que gmock compare les adresses de pointeur, et quand vous avez 2 chaînes constantes identiques, le regroupement de chaînes leur donnera la même valeur. Éteignez cette option du compilateur et regardez-la échouer.

Questions connexes