Domanda

Ho fatto questa domanda sul gruppo Google, ma penso di avere una risposta più veloce qui.

Sto cercando di utilizzare Mocking quadro di Google per testare il mio codice. Sto anche utilizzando il loro pure. Sto compilando in VC9. Sto avendo problemi corrispondenti argomenti che sono MFC \ ATL CStrings. GMock dice che gli oggetti non sono uguali e sembra che sta valutando sul indirizzi puntatore. Il metodo che sto cercando di prendere in giro è strutturato in questo modo:

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

così:

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

Quando si imposta le mie aspettative che sto facendo a confronto seguente:

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

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

Ho provato molte combinazioni diverse delle matchers come ad esempio:

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));

Una qualsiasi delle chiamate di cui sopra hanno prodotto lo stesso risultato. Chiunque altro run in questo problema?

Questa è l'uscita:

Google Mock ha provato i seguenti 2 aspettative, ma nessuno ha trovato:

: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

È stato utile?

Soluzione

Dal momento che non si stanno facendo una copia delle stringhe quando sono passati al metodo, non si ha realmente bisogno di controllare i loro valori? Esso dovrebbe essere sufficiente a scrivere il seguente aspettativa:

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

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

... che controllerà che i valori riportati al metodo finto sono infatti quelli che ci si aspetta (convalidato da indirizzo), e non una copia o altra stringa.

Per quanto riguarda il motivo per cui le matchers pre-in scatola non funzionano con CString, ho il sospetto che è sia perché CString non ignorare operator()== o le implementazioni matcher non hanno una specializzazione esplicita per CString.

Altri suggerimenti

Alla fine è stato un errore diverso. sospira E 'stato effettivamente prendendo un bug .... Google Mocks può confrontare CStrings bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top