Как совместить boost :: exception с boost :: unit_test и получить приятное сообщение - PullRequest
3 голосов
/ 22 марта 2011

Когда у меня есть следующий автоматический тест:

class MyException: virtual public boost::exception, 
                   virtual public std::exception 
{ 
};

BOOST_AUTO_TEST_CASE(ExceptionTest)
{
    BOOST_THROW_EXCEPTION(MyException());
}

Выполнение теста дает:

ExceptionTest.cpp(14): fatal error in "void ExceptionTest::test_method()":
   std::exception: std::exception

Как это изменить, чтобы вместо std::exception отображалось имя исключения (MyException) и boost::diagnostic_information()? Я попытался зарегистрировать свой собственный транслятор исключений на мониторе выполнения, но кажется, что std::exception обрабатывается до того, как будет пробован любой зарегистрированный транслятор.

Я использую boost 1.44 и gcc 4.4.5 в Linux.

1 Ответ

2 голосов
/ 23 марта 2011

Я нашел, как это сделать:

Использовать глобальное приспособление, например, так:

#include "boost/test/unit_test_monitor.hpp"

class Fixture
{
    public:
        Fixture();
        ~Fixture();
};

void translateBoostException(const boost::exception &e)
{
    BOOST_FAIL(boost::diagnostic_information(e));
}

Fixture::Fixture()
{
    boost::unit_test::unit_test_monitor.register_exception_translator<boost::exception>(&translateBoostException);
}

Fixture::~Fixture()
{
}

BOOST_GLOBAL_FIXTURE( Fixture )

Затем следующий тест:

class MyException: virtual public boost::exception, 
                   virtual public std::exception 
{ 
};

BOOST_AUTO_TEST_CASE(ExceptionTest)
{
    BOOST_THROW_EXCEPTION(MyException());
}

Дает:

Running 1 test case...
/home/..../SetupTestFixture.cpp(18): fatal error in "ConfigFile":
/home/..../Test.cpp(16): Throw in function void ConfigFile::test_method()
Dynamic exception type: boost::exception_detail::clone_impl<MyException>
std::exception::what: std::exception


*** 1 failure detected in test suite "ExceptionTest"
...