Как CppUnit реализует тест для исключения - PullRequest
6 голосов
/ 23 апреля 2010

Я знаю, что CppUnit позволяет проверять исключение через:

CPPUNIT_ASSERT_THROW(expression, ExceptionType);

Кто-нибудь может объяснить, как реализовано CPPUNIT_ASSERT_THROW()?

Ответы [ 2 ]

6 голосов
/ 23 апреля 2010

Сообщение о неудачных тестах в CppUnit осуществляется с помощью специального типа исключения. Мы назовем это CppUnitException здесь для простоты.

CPPUNIT_ASSERT_THROW - это макрос, который расширится до чего-то, что по сути это:

try
{
   expression;
   throw CppUnitException("Expected expression to throw");
}
catch( const ExceptionType & e )
{
}

Если expression сгенерирует (как мы и ожидали), мы попадем в блок catch, который ничего не делает.

Если expression делает не throw, выполнение переходит к строке кода, которая выбрасывает CppUnitException, что вызовет неудачный тест.

Конечно, реализация макроса CPPUNIT_ASSERT_THROW на самом деле немного интереснее, так что информация о строках и файлах также сообщается, но это общая суть его работы.

3 голосов
/ 23 апреля 2010

Редактировать: я проголосовал за ответ Майкла Андерсона, так как он более конкретен в отношении точного кода из 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;
...