Я знаю, что CppUnit позволяет протестировать на исключение через:
CPPUNIT_ASSERT_THROW(expression, ExceptionType);
Может кто-либо объяснять как CPPUNIT_ASSERT_THROW()
реализован?
Отчеты об ошибках тестирования в CppUnit выполняются путем выдачи пользовательского типа исключения. Мы назовем это CppUnitException
здесь для простоты.
CPPUNIT_ASSERT_THROW
- это макрос, который будет расширяться до чего-то, что по сути является следующим:
try
{
expression;
throw CppUnitException("Expected expression to throw");
}
catch( const ExceptionType & e )
{
}
Если выражение
выбрасывает (как мы и ожидали), мы попадаем в ловушку
блок, который ничего не делает.
Если выражение
вызывает , а не , выполнение переходит к строке кода, которая вызывает CppUnitException
, что вызывает сбой теста.
Конечно, реализация макроса CPPUNIT_ASSERT_THROW
на самом деле немного сложнее, так что информация о строках и файлах также сообщается, но это общая суть того, как это работает.
Изменить: я поддержал ответ Майкла Андерсона, поскольку он более конкретен в отношении точного кода из CppUnit, а мой - более общий ответ.
В псевдокоде это будет примерно так:
try
{
// Test code that should throw
}
catch(ExceptionType e)
{
// Correct exception - handle test success
return;
}
catch(...)
{
// Wrong exception, handle test failure.
return;
}
// No exception, handle test failure.
return;