2011-03-23 67 views

回答

19

是的,你可以通过重定向std::coutboost::test_tools::output_test_stream,它提供了特殊的方法来比较输出做到这一点。为确保std::cout始终可以正确恢复,可以使用自定义结构,如下例所示。

#define BOOST_TEST_MAIN 

#include <boost/test/unit_test.hpp> 
#include <boost/test/output_test_stream.hpp> 
#include <iostream> 

BOOST_AUTO_TEST_SUITE(TestSuite1) 

struct cout_redirect { 
    cout_redirect(std::streambuf * new_buffer) 
     : old(std::cout.rdbuf(new_buffer)) 
    { } 

    ~cout_redirect() { 
     std::cout.rdbuf(old); 
    } 

private: 
    std::streambuf * old; 
}; 

BOOST_AUTO_TEST_CASE(test1) 
{ 
    boost::test_tools::output_test_stream output; 
    { 
     cout_redirect guard(output.rdbuf()); 

     std::cout << "Test" << std::endl; 
    } 

    BOOST_CHECK(output.is_equal("Test\n")); 
} 

BOOST_AUTO_TEST_SUITE_END() 
+0

美丽,Space_C0wb0y。那么让我们看看我是否能够看到发生了什么。在cout_redirect构造函数中,我们设置了cout流缓冲区来提升输出测试流缓冲区。我们保存旧的cout流缓冲区。无论从cout中写入什么,直到cout_redirect被销毁,实际上都会被写入增强流缓冲区。当cout_redirect被破坏时,我们将cout流缓冲区重置为其先前的值,并且我们有一个带有所有我们想要的程序输出的增强流缓冲区。 – rturrado 2011-03-23 13:06:58

+0

@rturrado:的确如此。 – 2011-03-23 13:08:08

+0

我想,我们也可以做的是将增强流缓冲区设置为cout流缓冲区。在这种情况下,我们仍然会在cout中获得输出,并且我们可以使用增强流来检查它。 – rturrado 2011-03-23 13:09:07

4

我跟着@BjörnPollex的答案有些日子。但有一天,我发现没有必要这样做。只需使用boost::test_tools::output_test_stream

#define BOOST_TEST_MAIN 
#include <boost/test/unit_test.hpp> 
#include <boost/test/output_test_stream.hpp> 

BOOST_AUTO_TEST_SUITE(TestSuite1) 

BOOST_AUTO_TEST_CASE(test1) 
{ 
    boost::test_tools::output_test_stream output; 
    output << "Test"; 

    BOOST_CHECK(output.is_equal("Test")); 
} 

BOOST_AUTO_TEST_SUITE_END() 

欲了解更多信息,请阅读the official documentation

相关问题