GoogleMock — сопоставления и MFC\ATL CString

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

Я пытаюсь использовать фреймворк Google Mocking для тестирования своего кода. Я также использую их тестовую структуру. Я компилирую в VC9. У меня возникают проблемы с сопоставлением аргументов, которые являются MFC\ATL CStrings. 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

Адам


person Adam Driscoll    schedule 19.10.2009    source источник


Ответы (2)


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

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

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

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

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

person Steve Guidi    schedule 19.10.2009
comment
Некоторое значение является константой в 'myMethod'. Сравнение проводится между Некоторым значением, которое я предоставляю для макета, и Некоторым значением, которое создается в методе. Кроме того, CString переопределяет оператор()==, поэтому я предполагаю, что функция Eq(v) могла бы, по крайней мере, использовать это. Спасибо за отзыв! - person Adam Driscoll; 19.10.2009
comment
Я понимаю. Если какое-то значение недоступно, вы можете попробовать сопоставитель ResultOf, который выполняет предикат по вашему выбору для входного параметра функции. Это кажется излишним для сопоставления строк, но может дать некоторые подсказки относительно того, почему другие сопоставители не работают. - person Steve Guidi; 19.10.2009

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

person Adam Driscoll    schedule 19.10.2009