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.
'char * buffer = valeur.c_str();' ne devrait pas compiler. – chris
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
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