У меня есть тест на части кода, которая должна генерировать исключение, но с использованием 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
}
}
Странная часть заключается в том, что 'read_json' должен уже выбрасывать, но с другим сообщением об ошибке. И для теста emptyJson этот вариант 'pt.get()' также должен быть сброшен, но опять же другое сообщение об ошибке. –
Вы можете установить точку останова в конструкторе и перед броском и запустить его в отладчике. Вы можете заменить макрос boost явным try catch, используя отдельный catch для QueueMessageException, const QueueMessageException &, std :: exception. И если вы хотите контролировать исключения, конструктор должен поймать все, а затем выбросить собственное QueueMessageException. –
Хорошо, я постарался не публиковать весь код, и кажется, что это была проблема с дочерним ... Он выбрасывал исключение в первом вызове конструктора. – sop