Вопрос

Я задал этот вопрос в группе Google, но я думаю, что получу более быстрый ответ здесь.

Я пытаюсь использовать Издевательский фреймворк Google чтобы протестировать мой код.Я также использую их тестовый фреймворк также.Я компилирую в VC9.У меня возникают проблемы с сопоставлением аргументов, которые являются CStrings MFC \ ATL.GMock говорит, что объекты не равны, и, похоже, он вычисляет по адресам указателей .Метод, который я пытаюсь высмеять, структурирован вот так:

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

таким образом:

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

Устанавливая свои ожидания, я обращаюсь к следующему сравнению:

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

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

Я перепробовал много различных комбинаций сопоставителей, таких как:

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

Любой из вышеперечисленных вызовов привел к одному и тому же результату.Кто-нибудь еще сталкивался с этой проблемой?

Это и есть результат:

Google Mock попробовал следующие 2 ожидания, но ни одно из них не соответствовало:

: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

Адам

Это было полезно?

Решение

Поскольку вы не создаете копию строк, когда они передаются вашему методу, вам действительно нужно проверять их значения?Этого должно быть достаточно, чтобы написать следующее ожидание:

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

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

...который проверит, что строки, предоставленные макетному методу, действительно являются теми, которые вы ожидаете (проверены по адресу), а не копией или другой строкой.

Относительно того, почему предварительно законсервированные сопоставители не работают с CString, я подозреваю , что это либо потому , что CString не переопределяет operator()== или реализации matcher не имеют явной специализации для CString.

Другие советы

В итоге получилась другая ошибка. вздыхает На самом деле это было заражение ошибкой....Google Mocks отлично может сравнивать CStrings.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top