2011-03-23 121 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

相關問題