2009-10-19 16 views
1

J'ai posé cette question sur le groupe Google, mais je pense que j'obtiendrai une réponse plus rapide ici.GoogleMock - Matchers et MFC ATL CString

J'essaie d'utiliser Google's Mocking framework pour tester mon code. J'utilise aussi leur test framework. Je compile dans VC9. Je rencontre des problèmes de correspondance avec les arguments MFC \ ATL CStrings. GMock indique que les objets ne sont pas égaux et qu'il semble évaluer sur les 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)); 

Je essayé de nombreuses combinaisons différentes des allumettes telles 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)); 

L'un des appels ci-dessus a produit le même résultat. Quelqu'un d'autre exécute dans ce problème?

C'est la sortie:

Google Mock a essayé les 2 attentes suivantes, mais aucun matched:

: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

Répondre

0

Puisque vous ne faites pas une copie des cordes quand ils sont passé à 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és par adresse), et non une copie ou une autre chaîne.

En ce qui concerne la raison pour laquelle les pré-matchers en boîte ne je soupçonne que fonctionnent pas avec CString, il est soit parce que CString ne l'emporte pas sur operator()== ou les implémentations de matcher ne disposent pas d'une spécialisation explicite pour CString.

+0

La "certaine valeur" est une constante dans "myMethod". La comparaison est entre la «certaine valeur» que je fournis le faux et la «certaine valeur» qui est produite dans la méthode. En outre, CString remplace l'opérateur() == donc je suppose que la fonction Eq (v) pourrait au moins utiliser ceci. Merci pour la contribution! –

+0

Je vois. Si "Some Value" est inaccessible, vous pouvez essayer le programme 'ResultOf', qui exécute un prédicat de votre choix par rapport au paramètre d'entrée de la fonction. Cela semble exagéré pour l'appariement de chaînes, mais peut fournir des indices sur la raison pour laquelle les autres coupleurs ne fonctionnent pas. –

0

Terminé étant une erreur différente. soupirs Il était en fait attraper un bug .... Google Mocks peut comparer CStrings bien.