我正在使用googletest来检查任何派生类是否以某种方式实现了一个函数 .
其中一个限制是,如果找不到它应该找到的数据,它应该调用 assert(false);
. 如果你想知道,这是因为数据不可用是一个编程错误,它永远不会发生 .
现在我想为这个接口函数编写单元测试,我正在使用 TYPED_TEST_P
,其中要测试的类的类型作为参数给出 .
THE GIVEN EXAMPLE IS A SIMPLIFICATION.
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);在报告钩子函数中 .
2 回答
执行
std::abort(-1);
退出给予_CrtSetReportHook
的函数似乎使一切正常 .这是有效的,因为googletest会生成另一个进程来执行测试(使用EXPECT_DEATH) . 它实际上期待这种情况发生 .
这与问题没有直接关系,但看起来这是一个XY问题 . 真正听起来像代码味道的是:
如果每个派生类都必须抛出,如果它们被赋予nullptr作为输入参数,那么您可能希望在调用特定派生类方法之前,在接口和执行作业一次的实际实现类之间有一个基类 .
这是使用非虚拟接口(NVI)模式的示例 .
简而言之, Headers 就是
实施将是
所有这些都要求您没有可能使ptr无效的多线程 .