Visual Studio 2012 — VS2012 MSTest не может уловить утверждение, нативное переполнение стека

Я только начинаю с MSTest в VS2012. Я тестирую нативный C ++.

Я допустил ошибку в своем приложении, читая «с конца» строки STL … например.

wchar_t c = p_filename [p];

..в моем случае p было 20000, а p_filename — пустая строка. Очевидно, ошибка. Запуск в отладчике, это вызывает:

Msgstr «Утверждение отладки не удалось !! нижний индекс строки вне диапазона … (нажмите повторить, чтобы отладить приложение)».

ОДНАКО — выполнение этого кода в MSTest ПРОХОДИТ тест. Об ошибках не сообщается. Почему MSTest не улавливает эту ошибку во время выполнения? (или MSTest не обнаруживает утверждения утверждений в нативном c ++) ?? Разве MSTest не должен сообщать об этой серьезной ошибке?

1

Решение

Когда STL обнаруживает проблему в режиме отладки, он вызывает _CrtDbgBreak (), который обычно отображает диалоговое окно, позволяющее отладить проблему. Однако, работая под MSTest, ничего не происходит. Нет диалогового окна, MSTest может сообщить об успехе.
Я исправил это, подключившись к _CrtDbgBreak () и вызвав assert (), который использует другой механизм, встроенный в __debugbreak. Это вызывает знакомый диалог «Нажмите« Повторить »для отладки» в этих случаях.

    int MyReportHook(int nRptType, char *szMsg, int *retVal)
{
if( _CRT_ASSERT == nRptType )
{
assert(false);
}
return 0;
}

TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD_INITIALIZE(methodName)
{
_CrtSetReportHook(MyReportHook); // hook STL asserts.
}

TEST_METHOD(TestMethod1)
{
Assert::IsTrue( StripExtension( L"" ) == L"" ); // test for handling empty strings.
Assert::IsTrue( StripExtension( L"test.txt" ) == L"test" );
}

};
1

Другие решения

Это связано с перенаправлением утверждений, выполненных в файле CppUnitTest.h.

            _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);

Смысл в том, что вы не хотите, чтобы ваша автоматизация блокировала диалоги. Понятно не то, что вы хотите здесь. Но вы можете редактировать этот заголовок в соответствии с вашими потребностями и включить его обратно.

0

По вопросам рекламы [email protected]