2013-08-21 5 views
5

Sto cercando di impostare un parametro "out" su un mock con SetArgPointee. Ecco il codice che sto testando:Perché non posso utilizzare SetArgPointee() con googlemock?

DWORD bodysize = 1024; 
char body[1024]; 
HRESULT hr = req->ReadEntityBody(body, bodysize, false, &bodysize, NULL); 

req è un IHttpRequest*, e voglio impostare bodysize, argomento 3, nella finta. Ecco il codice dal mio test di unità:

EXPECT_CALL(req, ReadEntityBody(NotNull(), Ge(1024), false, NotNull(), _)) 
    .WillOnce(SetArgPointee<3>(4)) 
    .WillOnce(Return(ERROR_HANDLE_EOF)); 

Il risultato è il seguente errore strano:

error C2440: 'return' : cannot convert from 'void' to 'long' (gmock/gmock-actions.h:369)

Se io commento .WillOnce(SetArgPointee<3>(4)), il codice viene compilato ed eseguito correttamente. Ecco la definizione rilevante nel finto sé:

MOCK_METHOD5(ReadEntityBody, HRESULT(VOID *pvBuffer, DWORD cbBuffer, BOOL fAsync, DWORD *pcbBytesReceived, BOOL *pfCompletionPending)); 

E, nel caso aiuta, il mio full mock of IHttpRequest.

risposta

9

Le tue azioni non sono combined properly. Pertanto, la tua dichiarazione EXPECT_CALL non ha uno Return, motivo per cui stai ricevendo l'errore relativo al tentativo di convertire void in long. Assicurati di utilizzare un DoAll():

EXPECT_CALL(req, ReadEntityBody(NotNull(), Ge(1024), false, NotNull(), _)) 
    .WillOnce(DoAll(SetArgPointee<3>(4), Return(ERROR_HANDLE_EOF))); 
+0

Ovviamente non ho capito le azioni prima ora, heh. Grazie per l'aiuto! – ladenedge