2016-07-07 7 views
1

В Windows моя утверждают макрос по существу выглядит следующим образом:Ловля на заказ утверждают в GoogleTest с помощью __debugbreak

#define MYASSERT(condition) (if (!(condition)) { ReportFailture(#condition, __FILE__, __LINE__, __FUNCTION__); __debugbreak(); } 

И в тесте Google Я пытаюсь проверить выход в плохом состоянии, чтобы проверить связанных утверждений, и т.д.:

ASSERT_DEATH({ MYASSERT(false); }, ""); 

Однако все это он сообщить следующее сообщение:

Running main() from gtest_main.cc 
..\Test\FormatUnitTest\Test_Format.cpp(59): error: Death test: { if (!(false)) { ReportFailture("false", ..\\Test\\UnitTest\\Test.cpp", 59, __FSTREXP __FUNCTION_ 
_ ); __debugbreak(); }; } 

Result: illegal return in test statement. 
Error msg: 
[ DEATH ] 

Кажется, что GoogleTest обрабатывает исключение Debug в обработчике структурированных исключений (SEH) в качестве специального случая. Тем не менее, я хочу поймать утверждение и проверить его содержимое.

Что здесь нужно сделать? Мне нужно определить специальный утвердить макрос для теста Google? Если да, то что он должен делать?

Я отмечаю, что замена моего утверждения утверждением (false) (включенным через assert.h) не вызывает эту проблему - что она делает по-другому?

ответ

1

Проблема заключается в том, что вы вызываете __debugbreak(), что вызывает исключение точки останова для вашего кода. Как вы можете видеть в документации для испытаний на смерть (https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md#death-tests), если код вызывает исключение, он не считается «смертью» смертельными испытаниями в googletest.

Насколько идет вы другой вопрос, assert из assert.h Кальес std::abort (который вызывает программу прекратить). Это «смерть» по определению теста смерти.

+0

Мне нужно будет переопределить свой пользовательский макрос подтверждения при использовании теста google для вызова 'std :: abort' вместо' __debugbreak() ', что является неудачным, но я могу жить с этим. – Steven