Интеграция Google Mock и Catch.hpp

Мне очень нравится catch.hpp для тестирования (https://github.com/philsquared/Catch). Мне нравится его стиль BDD и его предложения REQUIRE, его версия утверждений. Однако, улов не приходит с насмешливой каркасом.

Проект, над которым я работаю, имеет GMock и GTest, но мы использовали уловку для нескольких проектов. Я хотел бы использовать GMock с уловкой.

Я обнаружил 2 конфликта в файлах catch.hpp и gtests для макросов FAIL и SUCCEED. Поскольку я не использую стиль TDD, но вместо этого стиль BDD я прокомментировал их, я проверил, что они не упоминаются нигде в catch.hpp.

Проблема. Использование EXPECT_CALL() не возвращает ничего или имеет обратные вызовы, чтобы узнать, прошел ли EXPECT. Я хочу сделать что-то вроде:

REQUIRE_NOTHROW(EXPECT_CALL(obj_a, an_a_method()).Times(::testing::AtLeast(1)));

Вопрос. Как я могу получить обратный вызов, если EXPECT_CALL не работает (или возвращаемое значение)

Ответ 1

РЕДАКТИРОВАТЬ: Выяснилось, как его интегрировать и поставить пример в этом реестре github https://github.com/ecokeley/catch_gmock_integration


После нескольких часов поиска я вернулся к gmock и просто прочитал кучу об этом. Обнаружено это в "Использование Google Mock с любой структурой тестирования" :

::testing::GTEST_FLAG(throw_on_failure) = true;
::testing::InitGoogleMock(&argc, argv);

Это приводит к тому, что исключение вызывается при сбое. Они рекомендуют "Обработка тестовых событий" для более плавной интеграции.

class MinimalistPrinter : public ::testing::EmptyTestEventListener {
  // Called after a failed assertion or a SUCCEED() invocation.
  virtual void OnTestPartResult(const ::testing::TestPartResult& test_part_result) {
    printf("%s in %s:%d\n%s\n",
         test_part_result.failed() ? "*** Failure" : "Success",
         test_part_result.file_name(),
         test_part_result.line_number(),
         test_part_result.summary());
  }
}

Ответ 2

Из-за макросов FAIL и SUCCEED в версии 1.8.0 gmock добавила следующее к gtest.h:

#if !GTEST_DONT_DEFINE_FAIL
  # define FAIL() GTEST_FAIL()
#endif

#if !GTEST_DONT_DEFINE_SUCCEED
  # define SUCCEED() GTEST_SUCCEED()
#endif

Итак, добавив GTEST_DONT_DEFINE_FAIL и GTEST_DONT_DEFINE_SUCCEED в определения препроцессора, вы избежите конфликта

Ответ 3

В проекте cppbdd также есть gtestbdd, который добавляет поддержку BDD в один заголовок для gtest (а не заменяет его). Недавно было улучшено включение параметризованных тестов в стиле BDD. В файле readme есть учебное пособие:

https://github.com/Resurr3ction/cppbdd