2014-11-18 3 views
2

У меня есть тест на части кода, которая должна генерировать исключение, но с использованием BOOST_CHECK_THROW по-прежнему выходит из строя тест. Вот тест:Ожидаемый результат теста Boost

#include <boost/test/unit_test.hpp> 

#include "tools/CQueueMessage.hpp" 

class TestMessage 
{ 
public: 
    std::string m_message1; 
    std::string m_message2; 
    std::string m_messageEmpty; 
    std::string m_messageEmptyJson; 

    TestMessage() 
    : m_message1("{\"photo\":{\"name\":\"pic\",\"extension\":\"jpg\"}}"), 
     m_message2("{\"photo\":{\"name\":\"pic\",\"extension\":\"png\"}}"), 
     m_messageEmpty(""), m_messageEmptyJson("{}") {} 
    ~TestMessage() {} 
}; 

BOOST_FIXTURE_TEST_CASE(message2send, TestMessage) 
{ 
    QueueMessage qmsg1(m_message1); 
    BOOST_CHECK_EQUAL(qmsg1.messageToBeSent(), "{\"photo\":{\"name\":\"pic\",\"extension\":\"jpg\"}}"); 

    QueueMessage qmsg2(m_message2); 
    BOOST_CHECK_EQUAL(qmsg2.messageToBeSent(), "{\"photo\":{\"name\":\"pic\",\"extension\":\"png\"}}"); 

    BOOST_CHECK_THROW(QueueMessage qmsg3(m_messageEmpty), QueueMessageException) 
// QueueMessage qmsg4(m_messageEmptyJson); 
} 

Конструктор класса QueueMessage бросает QueueMessageException если сообщение пуст, или если это пустой JSON. Моя проблема заключается в том, что этот тест печатает:

Running 1 test case... 
unknown location(0): fatal error in "message2send": std::exception: Bad message format 

*** 1 failure detected in test suite "main" 
*** Exited with return code: 201 *** 

Как я могу проверить, что выбрано исключение?


Это конструктор:

QueueMessage(CString& messageIn) 
{ 
    std::stringstream ss; 
    ss << messageIn; 
    PTree pt; 
    json::read_json(ss, pt); 
    std::string photo = pt.get<std::string>("photo"); 
    if (photo.empty()) 
    { 
     throw QueueMessageException("Bad message format"); // in debugging it arrives here 
    } 
} 
+0

Странная часть заключается в том, что 'read_json' должен уже выбрасывать, но с другим сообщением об ошибке. И для теста emptyJson этот вариант 'pt.get()' также должен быть сброшен, но опять же другое сообщение об ошибке. –

+0

Вы можете установить точку останова в конструкторе и перед броском и запустить его в отладчике. Вы можете заменить макрос boost явным try catch, используя отдельный catch для QueueMessageException, const QueueMessageException &, std :: exception. И если вы хотите контролировать исключения, конструктор должен поймать все, а затем выбросить собственное QueueMessageException. –

+0

Хорошо, я постарался не публиковать весь код, и кажется, что это была проблема с дочерним ... Он выбрасывал исключение в первом вызове конструктора. – sop

ответ

2

Мои психические силы отладки сказать мне, что ваш конструктор фактически не бросает QueueMessageException. Похоже, он (через функцию message2send) бросает std::exception или другой его ребенок.

Смежные вопросы