Я только начинаю с MSTest в VS2012. Я тестирую нативный C ++.
Я допустил ошибку в своем приложении, читая «с конца» строки STL … например.
wchar_t c = p_filename [p];
..в моем случае p было 20000, а p_filename — пустая строка. Очевидно, ошибка. Запуск в отладчике, это вызывает:
Msgstr «Утверждение отладки не удалось !! нижний индекс строки вне диапазона … (нажмите повторить, чтобы отладить приложение)».
ОДНАКО — выполнение этого кода в MSTest ПРОХОДИТ тест. Об ошибках не сообщается. Почему MSTest не улавливает эту ошибку во время выполнения? (или MSTest не обнаруживает утверждения утверждений в нативном c ++) ?? Разве MSTest не должен сообщать об этой серьезной ошибке?
Когда 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" );
}
};
Это связано с перенаправлением утверждений, выполненных в файле CppUnitTest.h.
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
Смысл в том, что вы не хотите, чтобы ваша автоматизация блокировала диалоги. Понятно не то, что вы хотите здесь. Но вы можете редактировать этот заголовок в соответствии с вашими потребностями и включить его обратно.