GoogleMock - Сопоставители и CString MFC\ATL
-
22-09-2019 - |
Вопрос
Я задал этот вопрос в группе 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.