Question

J'ai posé cette question sur le groupe Google, mais je pense que je vais obtenir une réponse plus rapide ici.

Je suis en train d'utiliser cadre Mocking de Google pour tester mon code. J'utilise également leur ainsi. Je compile en VC9. Je rencontre des problèmes correspondant à des arguments qui sont MFC \ ATL CStrings. GMock dit que les objets ne sont pas égaux et il semble qu'il évalue sur la adresses de pointeur. La méthode que je vais tenter de se moquer est structuré comme ceci:

void myMethod(const CString & key, const CString & value);

ainsi:

MOCK_METHOD2(myMethod, void(const CString & key , const CString &
value);

Lors de la configuration de mes attentes que je fais à la comparaison suivante:

CString szKey = _T("Some key");
CString szValue = _T("Some value");

EXPECT_CALL(myMock, myMethod(Eq(szKey), Eq(szValue))).WillOnce(Return
(true));

J'ai essayé beaucoup de combinaisons différentes des matchers tels que:

EXPECT_CALL(myMock, myMethod(StrCaseEq(_T("Some Key")), StrCaseEq(_T
(""Some value)))).WillOnce(Return(true));

EXPECT_CALL(myMock, myMethod(TypedEq<const CString &>(szKey),
TypedEq<const CString &>(szValue))).WillOnce(Return(true));


EXPECT_CALL(myMock, myMethod(TypedEq<const CString &>(szKey),
TypedEq<const CString &>(szValue))).WillOnce(Return(true));

Tous des appels ci-dessus ont produit le même résultat. Toute personne autre course dans cette question?

Ceci est la sortie:

Google Mock a essayé les 2 attentes suivantes, mais aucune correspondance:

:80: tried expectation #0
  Expected arg #1: is equal to 006D430C pointing to "Some value"
           Actual: 4-byte object <A8EF 1102>
         Expected: to be called once
           Actual: never called - unsatisfied and active
:83: tried expectation #1
  Expected arg #1: is equal to (ignoring case) ""
           Actual: 4-byte object <A8EF 1102>
  Expected arg #2: is equal to (ignoring case) "Some value"
           Actual: 4-byte object <C0EE 1102>
         Expected: to be called once
           Actual: never called - unsatisfied and active

Adam

Était-ce utile?

La solution

Puisque vous ne faites pas une copie des cordes quand ils sont passés à votre méthode, avez-vous vraiment besoin de vérifier leurs valeurs? Il devrait suffire d'écrire l'attente suivante:

CString szKey = _T("Some key");
CString szValue = _T("Some value");

EXPECT_CALL(myMock, myMethod(szKey, szValue)).WillOnce(Return(true));

... qui vérifiera que les chaînes données à la méthode maquette sont en effet ceux que vous attendez (validé par adresse), et non une copie ou une autre chaîne.

En ce qui concerne la raison pour laquelle les matchers pré-boîte ne fonctionnent pas avec CString, je pense qu'il est soit parce que CString ne remplace pas operator()== ou les implémentations de matcher ne dispose pas d'une spécialisation explicite pour CString.

Autres conseils

a fini par être une autre erreur. soupire Il attrapait en fait un bug .... Google peut comparer Mocks CStrings très bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top