【问题标题】:How to combine boost::exception with boost::unit_test and have a nice message如何结合 boost::exception 与 boost::unit_test 并有一个很好的消息
【发布时间】:2011-03-22 14:04:29
【问题描述】:

当我有以下自动测试用例时:

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:我尝试为我的异常和 boost::exception 注册它,但它不起作用。当然也有可能是我注册的时候弄错了。 (我在几个地方尝试了boost::unit_test::unit_test_monitor.register_exception_translator<MyException>(&handler);,比如全局夹具和测试自我。)
  • @Gennadiy Rozental:来自std::exception 的虚拟继承是因为没有它BOOST_THROW_EXCEPTION 将无法编译,根据boost::exception 的文档,这是一件“好事”:@987654321 @
  • @Gennadiy Rozental:我尝试再次注册我自己的翻译器,现在不知何故它可以工作了。我想我之前犯了一个错误。请参阅下面的答案。

标签: c++ unit-testing exception boost


【解决方案1】:

我找到了如何做到这一点:

像这样使用全局夹具:

#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"

【讨论】:

    猜你喜欢
    • 2011-04-10
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 2010-12-22
    • 2017-10-30
    • 1970-01-01
    相关资源
    最近更新 更多