Boost test: поймать определенные пользователем исключения - PullRequest
4 голосов
/ 26 мая 2010

Если в моем коде есть определенные пользователем исключения, я не могу пройти тест Boost считать их неудачами.

Например,

BOOST_AUTO_TEST_CASE_EXPECTED_FAILURES(MyTest,1)
BOOST_AUTO_TEST_CASE(MyTest)
{
// code which throws user defined exception, not derived from std::exception.

}

Я получаю общее сообщение:

Caught exception: ....
unknown location(0):....

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

Как сделать так, чтобы фрагмент кода всегда вызывал исключение? Это, кажется, полезная вещь, чтобы хотеть. В случае будущих изменений кода вызывают код пройти и исключение не выбрасывается, я хочу знать, что.

1 Ответ

8 голосов
/ 26 мая 2010

EXPECTED_FAILURES относится к сбоям против BOOST_REQUIRE или другим утверждениям. В документации четко указано:

Эта функция не предназначена для проверки возможных сбоев функций. Чтобы проверить, что определенный ввод вызывает исключение , используйте BOOST_CHECK_THROW семейство инструментов тестирования.

Акцент был мой.

Ожидаемые сбои предназначены для использования в качестве временного обходного пути во время тестирования, когда утверждение не выполняется, но вы хотите временно его игнорировать.

Взяв фрагмент из их ожидаемых сбоев, спецификация :

BOOST_AUTO_TEST_CASE_EXPECTED_FAILURES( my_test1, 1 )

BOOST_AUTO_TEST_CASE( my_test1 )
{
    BOOST_CHECK( 2 == 1 );
}

приведет к выводу

test.cpp(10): error in "my_test1": check 2 == 1 failed

Test suite "example" passed with:
  1 assertions out of 1 failed
  1 failures expected
  1 test case out of 1 passed

Как видите, несмотря на неудачные утверждения, контрольный пример все же прошел из-за использования ожидаемых сбоев.


Так что, если вам нужно убедиться, что что-то вызывает исключение, используйте код, подобный следующему:

BOOST_AUTO_TEST_CASE(invalid_operation_should_throw_custom_exception)
{
    MyObj obj;
    BOOST_REQUIRE_THROW(obj.invalid_operation(), CustomException);
}
...