2011-03-23 6 views

Respuesta

19

Sí, puede hacerlo mediante la reorientación de std::cout a un boost::test_tools::output_test_stream, que proporciona métodos especiales para comparar la salida. Para asegurarse de que std::cout siempre se restaura correctamente, puede usar una estructura personalizada, como se muestra en el siguiente ejemplo.

#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. Así que vamos a ver si entiendo lo que está pasando allí. En el constructor cout_redirect configuramos el buffer de flujo cout para aumentar el buffer de flujo de prueba de salida. Y guardamos el viejo buffer de flujo cout. Lo que está escrito a partir de ahí en cout, y hasta que se destruya cout_redirect, está escrito en el búfer de flujo de refuerzo. Cuando se destruye cout_redirect, reiniciamos el buffer de flujo de cout a su valor anterior, y tenemos un buffer de flujo boost con toda la salida de programa que queríamos. – rturrado

+0

@rturrado: Exactamente. –

+0

Supongo que lo que también podríamos hacer es configurar el búfer de flujo de refuerzo para ejecutar el buffer de flujo. En ese caso, aún obtendríamos salida en cout, y podríamos ser capaces de verificarlo usando la corriente de impulso. – rturrado

4

He seguido la respuesta de @Björn Pollex por algunos días. Pero un día descubrí que no es necesario hacerlo así. Simplemente use 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() 

Para obtener más información, lea the official documentation.

Cuestiones relacionadas