1

我刚从 VS2012 中的 MSTest 开始。我正在测试本机 C++。

我在我的应用程序中犯了一个错误,读取了一个 STL 字符串的“结尾”......例如

wchar_t c = p_filename[p];

..在我的情况下 p 是 20000 而 p_filename 是一个空字符串。显然是一个错误。在调试器中运行,这会触发:

“调试断言失败!!..字符串下标超出范围...(按重试调试应用程序)”。

但是 - 在 MSTest 中运行此代码可以通过测试。没有报告错误。为什么 MSTest 没有发现这个运行时错误?(或者 MSTest 没有检测到原生 c++ 中的断言语句)??MSTest 不应该报告这个严重的错误吗?

4

2 回答 2

1

当 STL 在调试模式下检测到问题时,它会调用 _CrtDbgBreak(),通常会显示一个对话框,允许您调试问题。但是在 MSTest 下运行,什么也没有发生。没有对话框,MSTest 可能会报告成功。我通过连接到 _CrtDbgBreak() 并触发 assert() 来解决这个问题,它使用不同的机制,__debugbreak 内在。在这些情况下,这会触发熟悉的“Press 'retry' to debug”对话框。

    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" );
    }

};
于 2013-01-25T03:02:43.573 回答
0

这是由于在 CppUnitTest.h 文件中完成的断言重定向。

            _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);

这里的目的是您不希望您的自动化阻止对话框。显然不是你想要的。但是您可以根据需要编辑此标头并将其重新启用。

于 2013-01-31T04:45:21.690 回答