2011-03-23 17 views

cevap

19

Evet, çıktıyı karşılaştırmak için özel yöntemler sağlayan bir boost::test_tools::output_test_stream e std::cout yönlendirerek yapabilirsiniz. std::cout'un her zaman doğru şekilde geri yüklendiğinden emin olmak için, aşağıdaki örnekte gösterildiği gibi özel bir yapı kullanabilirsiniz.

#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

Güzel, Space_C0wb0y. O zaman orada neler olup bittiğini görelim. Cout_redirect yapıcısında, çıkış testi akışı arabelleğini artırmak için cout akış arabelleğini belirleriz. Ve eski cout stream buffer'ını kurtarıyoruz. Cout_redirect yok edilene kadar, oradan ne yazılırsa yazılsın, aslında boost akım tamponuna yazılır. Cout_redirect imha edildiğinde, cout stream buffer'ı önceki değerine sıfırlarız ve istediğimiz tüm program çıktısına sahip bir boost akışı tamponuna sahibiz. – rturrado

+0

@rturrado: Kesinlikle. –

+0

Sanırım, aynı zamanda, akıntı akış tamponunu cout akış tamponuna ayarlamak için yapabileceğimiz şey. Bu durumda, yine de cout'ta çıktı alırdık ve boost akımını kullanarak bunu kontrol edebilirdik. – rturrado

4

Bazı günlerde Björn Pollex'in yanıtını takip ettim. Ama bir gün bunu böyle yapmak için gerekli olmadığını buldum. Sadece boost::test_tools::output_test_stream kullanın.

#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() 

Daha fazla bilgi için, the official documentation'u okuyun.

İlgili konular