2013-02-28 38 views
8

basılı ve bir istisnası atılır, böyle bir istisna atıldı o , ama asla istisnanın mesaj görüntüler:BOOST_CHECK_NO_THROW ben</p> <pre><code>BOOST_CHECK_NO_THROW(method_to_test()); </code></pre> <p>kullanarak bir yöntemi sınamak

test.cpp(14): error in "test": incorrect exception my_exception is caught 

İstisna mesajının yanı sıra my_exception.what() tarafından döndürülen dize de yazdırılabilir mi? my_exception, std::exception'dan ve what() aşırı yüklenmesinden türetilmiştir.

+0

Yazma ? Yükseltme Testleri, kodun hata ayıklaması için kodun kırılmadığını kontrol etmek içindir. Bozuk mu? Bu boole değeri: doğru veya yanlış. Özel durum oluşursa (test koşucunun komut satırı argümanlarının göre konsolun veya xml dosyası,) standart çıktı –

+0

(1) Yazma (2) , evet bozuldu . Ancak istisna mesajını görebiliyorsa (what()) çıktısı, hatanın nereden geldiğini bulmak için daha hızlıdır. – 550

+0

Evet ama neden? Test kodun bozuk olduğunu gösterdi: atmaması gereken istisnalar attı. Bir sonraki adım, kod veya testi düzeltmek ve çöp ile doldurulmuş konsolun ayrıntılı XML dosyalarını oluşturmamaktır. –

cevap

5

Destek başlıklarını yeniden okuyun ve BOOST_CHECK_NO_THROW_IMPL yeniden tanımlanmış kendi üstbilgi dosyasında yeniden tanımlama davranışını yeniden tanımlamak için projede kullanıyorum. Şimdi şuna benzer:

#ifndef _CATCH_BOOST_NO_THROW_H_ 
#define _CATCH_BOOST_NO_THROW_H_ 

#include <boost/test/unit_test.hpp> 
#include <sstream> 
#include <string> 

#define BOOST_CHECK_NO_THROW_IMPL(S, TL)              \ 
    try {                      \ 
    S;                       \ 
    BOOST_CHECK_IMPL(true, "no exceptions thrown by " BOOST_STRINGIZE(S), TL, CHECK_MSG); } \ 
    catch(const std::exception & e) {               \ 
    std::stringstream ss;                  \ 
    ss << std::endl                    \ 
    << "-----------------------------------------------" << std::endl       \ 
    << "test case: " << boost::unit_test::framework::current_test_case().p_name << std::endl \ 
    << std::endl << "exception message: " << e.what() << std::endl;        \ 
    BOOST_TEST_MESSAGE(ss.str());                \ 
    BOOST_CHECK_IMPL(false, "exception thrown by " BOOST_STRINGIZE(S), TL, CHECK_MSG);  \ 
    }                       \ 
    catch(...) {                    \ 
    std::stringstream ss;                  \ 
    ss << std::endl                    \ 
    << "-----------------------------------------------" << std::endl       \ 
    << "test case: " << boost::unit_test::framework::current_test_case().p_name << std::endl \ 
    << std::endl << "exception message : <unknown exception>" << std::endl;      \ 
    BOOST_TEST_MESSAGE(ss.str());                \ 
    BOOST_CHECK_IMPL(false, "exception thrown by " BOOST_STRINGIZE(S), TL, CHECK_MSG);  \ 
    }                       \ 
    /**/ 

#define BOOST_WARN_NO_THROW(S)   BOOST_CHECK_NO_THROW_IMPL(S, WARN) 
#define BOOST_CHECK_NO_THROW(S)   BOOST_CHECK_NO_THROW_IMPL(S, CHECK) 
#define BOOST_REQUIRE_NO_THROW(S)   BOOST_CHECK_NO_THROW_IMPL(S, REQUIRE) 

#endif // _CATCH_BOOST_NO_THROW_H_ 

dezavantajları şunlardır: olarak işaretlendiğinde önce istisna mesajı yazdırılır

ve

BOOST _ * _ NO_THROW değişiklik olmadığı gibi uzun olarak çalışır test çıktısında hata. Bu ilk etapta biraz pisi görünüyor, bu yüzden çıkışı geliştirmek için çıkışa "---" yazarak çıkışı gruplandırıyorum. Ancak BOOST_CHECK_IMPL koduna hiçbir zaman ulaşılamayacak. Yukarıdaki çözüm benim için oldukça iyi çalışıyor.) = Aynı whish var ise, hiç çekinmeden kullanabilirsiniz

(ctest çıkış için CDash kullanma limitini testi çıkış limitini artırmak için unutmak ya da basit devre dışı değildir: hiç http://web.archiveorange.com/archive/v/5y7PkVuHtkmVcf7jiWol)

5

Kendimi BOOST_REQUIRE_NO_THROW ile aynı sorundan rahatsız buldum. BOOST_REQUIRE_NO_THROW'u kaldırarak çözdüm. Bu gibi çıktıda sonuçlar:

unknown location(0): fatal error in "TestName": std::runtime_error: Exception message 

ve testi iptal eder (ancak bir sonraki metin ile devam ediyor) istediğim budur. Bununla birlikte, BOOST_CHECK_NO_THROW veya BOOST_WARN_NO_THROW kullanmak istediğinizde bu çok yardımcı olmaz.

+0

Garip bir şekilde benim için en iyi çözüm bu kadar. – Archont

İlgili konular