PrintTo для указателя в Google Test

#c #googletest

#c #googletest

Вопрос:

Я могу указать, как отображать содержимое объекта, если тест не удался. Чтобы сделать это, я определяю функцию PrintTo для класса. Результат соответствует желаемому (строка MyObject as object ):

 x.cpp:17: Failure
Value of: foo1
Expected: has foo <MyObject as object>
  Actual: <MyObject as object> (of type Foo)
  

К сожалению, я не могу найти, как сделать то же самое для указателя на объект. Вместо пользовательской строки MyObject as pointer я получаю вывод по умолчанию:

 x.cpp:22: Failure
Value of: pfoo1
Expected: has foo 0x8058330
  Actual: 0x8058320 (of type Foo*)
  

В качестве обходного пути я могу разыменовывать указатели, но я хотел бы знать, есть ли прямое решение, которое заключается в перегрузке PrintTo указателя.

 #include <gmock/gmock.h>

struct Foo { };

void PrintTo(const Fooamp; value, ::std::ostream* os) {
  *os << "<MyObject as object>";
}

void PrintTo(const Foo* value, ::std::ostream* os) {
  *os << "<MyObject as pointer>";
}

MATCHER_P(HasFoo, expected, "") { return false; }

TEST(Foo, Object) {
  Foo foo1, foo2;
  ASSERT_THAT(foo1, HasFoo(foo2));
}

TEST(Foo, Pointer) {
  Foo *pfoo1 = new Foo(), *pfoo2 = new Foo();
  ASSERT_THAT(pfoo1, HasFoo(pfoo2));
}

int main(int argc, char** argv) {
  testing::InitGoogleTest(amp;argc, argv);
  return RUN_ALL_TESTS();
}
  

Комментарии:

1. Вы пробовали перегрузку as void PrintTo(Foo* value, ::std::ostream* os) ? const Здесь все может иметь значение.

2. Или, может PrintTo(Foo *const value, ::std::ostream *os) быть?

Ответ №1:

Как было предложено @AndyG и @olaf-dietsche, ведущий const должен быть удален. Они работают:

Foo* value

Foo* const value

И это не:

const Foo* value

const Foo* const value

const Foo*amp; value