2011-03-23 6 views

답변

19

예, 출력을 비교하는 특별한 방법을 제공하는 boost::test_tools::output_test_streamstd::cout을 리디렉션하여 그것을 할 수 있습니다. 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

Beautiful, Space_C0wb0y. 그럼 내가 무슨 일이 일어나는지 보자. cout_redirect 생성자에서 출력 테스트 스트림 버퍼를 증가시키기 위해 cout 스트림 버퍼를 설정합니다. 그리고 오래된 cout 스트림 버퍼를 저장합니다. cout에서 거기에서 쓰여지고 cout_redirect가 소멸 될 때까지 실제로는 부스트 스트림 버퍼에 기록됩니다. cout_redirect가 소멸되면, 우리는 cout 스트림 버퍼를 이전 값으로 리셋하고 우리가 원하는 모든 프로그램 출력을 가진 부스트 스트림 버퍼를 갖게됩니다. – rturrado

+0

@rturrado : 정확합니다. –

+0

우리가 할 수있는 일은 부스트 ​​스트림 버퍼를 cout 스트림 버퍼로 설정하는 것입니다. 이 경우, 우리는 여전히 출력을 얻을 것이고, 우리는 그것을 부스트 스트림을 사용하여 체크 할 수있을 것이다. – rturrado

4

나는 @ Björn Pollex의 대답을 몇일 동안 따라 갔다. 그러나 언젠가는 그렇게 할 필요가 없다는 것을 발견했습니다. 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을 참조하십시오.