首页 > 解决方案 > 如何在 Windows 中管理 googletest 中的断言

问题描述

我正在使用 googletest 检查任何派生类是否以某种方式实现了函数。

限制之一是assert(false);如果找不到它应该找到的数据,它应该调用。如果你想知道,这是因为数据不可用是一个编程错误,它不应该发生。

现在我想为这个接口函数编写一个单元测试,我正在使用TYPED_TEST_P其中要测试的类的类型作为参数给出。

给定的例子是一个简化。

TYPED_TEST_P(InterfaceFuntionTests, CheckThatCallAssertsOnNull)
{
   // All m_ prefixed variables are given from the test instantiation.
   // Since we do not know what combination of values is invalid for each
   // class that implements compute.
   EXPECT_DEATH(m_model->compute(m_value1, m_value2, m_value3, m_value4, "Time to die.");
}

一切正常,但 Windows 想要显示该"Abort/Retry/Ignore"窗口。

禁用此窗口的最佳方法是什么?我一直认为 googletest 可能以某种方式涵盖了这一点。

_CrtSetReportMode( _CRT_ASSERT,  _CRTDBG_MODE_DEBUG);
// This eats the assertions and the test doesn't work.

_CrtSetReportHook(functionThatReturnsTrue);
// This eats the assertions and the test doesn't work.

请注意,此问题特定于Windows


我很想删除这个问题,因为我找到了一个可行的解决方案。

如果有人有更好的答案,我会把这个问题留在这里。

我的解决方案是调用 std::abort(-1); 在报告挂钩函数中。

标签: c++windowsgoogletest

解决方案


退出std::abort(-1);给定的功能_CrtSetReportHook似乎可以使一切正常工作。

这是因为 googletest 产生了另一个进程来执行测试(使用 EXPECT_DEATH)。它实际上期待这种情况发生。


推荐阅读