Интеграция 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