BOOST_CHECK_NO_THROW как напечатать сообщение об исключении

Когда я тестирую метод, используя

BOOST_CHECK_NO_THROW( method_to_test() );

и выдается исключение, оно отображает тот было сделано исключение, но никогда сообщение об исключении как это:

test.cpp(14): error in "test": incorrect exception my_exception is caught

Можно ли распечатать сообщение об исключении, то есть строку, возвращаемую my_exception.what()? my_exception происходит от std::exception и перегрузки what(),

9

Решение

Я прочитал немного в заголовках повышения и переопределил BOOST_CHECK_NO_THROW_IMPL в своем собственном заголовочном файле, который я использую в проекте, чтобы переопределить поведение повышения. Теперь это выглядит так:

#ifndef _CATCH_BOOST_NO_THROW_H_
#define _CATCH_BOOST_NO_THROW_H_

#include <boost/test/unit_test.hpp>
#include <sstream>
#include <string>

#define BOOST_CHECK_NO_THROW_IMPL( S, TL )                                                      \
try {                                                                                       \
S;                                                                                          \
BOOST_CHECK_IMPL( true, "no exceptions thrown by " BOOST_STRINGIZE( S ), TL, CHECK_MSG ); } \
catch( const std::exception & e ) {                                                         \
std::stringstream ss;                                                                       \
ss << std::endl                                                                             \
<< "-----------------------------------------------" << std::endl                           \
<< "test case: " << boost::unit_test::framework::current_test_case().p_name << std::endl    \
<< std::endl << "exception message: " << e.what() << std::endl;                             \
BOOST_TEST_MESSAGE(ss.str());                                                               \
BOOST_CHECK_IMPL( false, "exception thrown by " BOOST_STRINGIZE( S ), TL, CHECK_MSG );      \
}                                                                                           \
catch( ... ) {                                                                              \
std::stringstream ss;                                                                       \
ss << std::endl                                                                             \
<< "-----------------------------------------------" << std::endl                           \
<< "test case: " << boost::unit_test::framework::current_test_case().p_name << std::endl    \
<< std::endl << "exception message : <unknown exception>" << std::endl;                     \
BOOST_TEST_MESSAGE(ss.str());                                                               \
BOOST_CHECK_IMPL( false, "exception thrown by " BOOST_STRINGIZE( S ), TL, CHECK_MSG );      \
}                                                                                           \
/**/

#define BOOST_WARN_NO_THROW( S )            BOOST_CHECK_NO_THROW_IMPL( S, WARN )
#define BOOST_CHECK_NO_THROW( S )           BOOST_CHECK_NO_THROW_IMPL( S, CHECK )
#define BOOST_REQUIRE_NO_THROW( S )         BOOST_CHECK_NO_THROW_IMPL( S, REQUIRE )

#endif // _CATCH_BOOST_NO_THROW_H_

Недостатки: это работает, пока нет никаких изменений в BOOST _ * _ NO_THROW

а также

сообщение об исключении будет напечатано до того, как оно будет помечено как ошибка в результатах теста. Во-первых, это выглядит немного жалко, поэтому я сгруппировал вывод, написав «—», чтобы улучшить чтение. Но код после BOOST_CHECK_IMPL никогда не будет достигнут.

Решение выше работает довольно хорошо для меня. Не стесняйтесь использовать, если вы получили то же самое желание =)

(Используя CDash для вывода ctest, не забудьте увеличить лимит тестового вывода или просто отключите лимит: http://web.archiveorange.com/archive/v/5y7PkVuHtkmVcf7jiWol )

6

Другие решения

Я был раздражен той же проблемой с BOOST_REQUIRE_NO_THROW, Я решил это, просто удалив BOOST_REQUIRE_NO_THROW, Это приводит к выводу как:

unknown location(0): fatal error in "TestName": std::runtime_error: Exception message

и прерывает тест (но продолжает со следующим текстом), что я и хотел. Это не очень помогает, если вы хотите использовать BOOST_CHECK_NO_THROW или BOOST_WARN_NO_THROW, хотя.

5