Pergunta

Fiz essa pergunta no grupo do Google, mas acho que vou obter uma resposta mais rápida aqui.

Estou tentando usar Estrutura de zombaria do Google Para testar meu código. Eu também estou utilizando o seu estrutura de teste também. Estou compilando no VC9. Estou tendo problemas para combinar argumentos que são MFC ATL CStrings. O GMOCK diz que os objetos não são iguais e parece que está avaliando nos endereços do ponteiro. O método que estou tentando zombar é estruturado assim:

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

portanto:

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

Ao configurar minhas expectativas que estou fazendo para seguir a comparação:

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

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

Eu tentei muitas combinações diferentes dos matcores, como:

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

Qualquer uma das chamadas acima produziu o mesmo resultado. Alguém mais se depara com esse problema?

Esta é a saída:

O Google Mock tentou as 2 expectativas a seguir, mas nenhuma correspondeu:

: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

Adão

Foi útil?

Solução

Como você não está fazendo uma cópia das cordas quando elas são passadas para o seu método, você realmente precisa verificar seus valores? Deve ser suficiente escrever a seguinte expectativa:

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

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

... que verificará se as seqüências dadas ao método simulado são realmente as que você espera (validado por endereço), e não uma cópia ou outra string.

Sobre por que os matcores pré-presos não funcionam com CString, Eu suspeito que seja porque CString não substitui operator()== ou as implementações do Matcher não têm uma especialização explícita para CString.

Outras dicas

Acabou sendo um erro diferente. suspiros Na verdade, estava pegando um bug ... o Google Mocks pode comparar o CStrings muito bem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top