在BOOST_CHECK_EQUAL期间隐藏cerr输出

时间:2014-07-07 19:45:07

标签: c++ unit-testing boost boost-test

我正在测试一个返回整数错误代码的函数。我正在使用BOOST_CHECK_EQUAL来比较函数返回错误代码。与此类似:

BOOST_CHECK_EQUAL( foo(a), 12 ) // where 12 is an error code

函数foo中有一个cerr语句,在返回错误代码之前会触发该语句。有没有办法隐藏错误信息?目前我的输出内容如下:

Running 7 test cases...
Error in foo()

*** No errors detected

我想要

Running 7 test cases...

*** No Errors detected

有没有办法在一次测试中使用等效的2>/dev/null来运行此测试?提前谢谢。

1 个答案:

答案 0 :(得分:1)

一个选项是将返回值保存在变量中,以便在检查前触发副作用:

auto result = foo(a);
BOOST_CHECK_EQUAL(result, 12)

隐藏输出的另一个是将std::cerr的缓冲区更改为写入dev/null

namespace ns {
    struct defer_output_wrapper
    {
        defer_output_wrapper(std::ostream& os) : os(os), sbuf(os.rdbuf())
        {
            os.rdbuf(null.open("dev/null", std::ios_base::out));
        }

        ~defer_output_wrapper() { os.rdbuf(sbuf); }
    private:
        std::ostream& os;
        std::streambuf* sbuf;
        std::filebuf null;
    };
}

稍后......

{
    ns::defer_output_wrapper _(std::cerr); // Output on std::cerr writes to dev/null
    BOOST_CHECK_EQUAL(foo(a), 12)
} // buffer changes back