如何将boost::exception与boost::unit_test结合使用并获得良好的消息提示

3
当我有以下自动化测试用例时:
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

我该如何修改代码以便显示异常的名称(MyException)和boost::diagnostic_information(),而不是std::exception?我尝试将自己的异常翻译器注册到执行监视器中,但似乎在尝试调用已注册的翻译器之前就处理了std::exception
我在Linux上使用 boost 1.44 和 gcc 4.4.5。

我认为这个问题在Boost.Test主干中已经解决了。可能是我没有将更改移动到发布版中 - 最近没有太多时间来处理Boost.test。顺便问一下,你是否为你的异常或std::exception注册了翻译器?另外,为什么你需要从std::exception进行虚拟继承? - Gennadiy Rozental
@Gennadiy Rozental:我尝试为我的异常和boost::exception进行注册,但没有成功。当然,我注册时可能犯了错误。(我在全局fixture和测试本身中尝试了boost::unit_test::unit_test_monitor.register_exception_translator<MyException>(&handler);等多个位置。) - rve
@Gennadiy Rozental:从std::exception的虚继承是因为没有它,BOOST_THROW_EXCEPTION将无法编译,并且根据boost::exception文档的说法,这是一件“好事情”:http://www.boost.org/doc/libs/1_46_0/libs/exception/doc/frequently_asked_questions.html - rve
@Gennadiy Rozental:我尝试重新注册我的翻译器,不知何故现在它可以工作了。我想我之前肯定犯了一个错误。请看下面的答案。 - rve
1个回答

2
我找到了如何做到这一点:
使用全局 fixture,如下所示:
#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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接