如何在Windows中的googletest中管理断言

时间:2018-09-21 09:45:10

标签: c++ 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);在报表挂钩功能中。

2 个答案:

答案 0 :(得分:0)

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

之所以可行,是因为googletest产生了另一个进程来执行测试(使用EXPECT_DEATH)。实际上,这是期望发生的事情。

答案 1 :(得分:0)

这与问题没有直接关系,但在这里看起来像是XY问题。真正听起来像代码气味的是:

  

检查是否有任何派生类以某种方式实现了功能

如果每个派生类都必须抛出nullptr作为输入参数,则可能需要在调用特定派生类方法之前在接口和执行该操作的实际实现类之间创建一个基类。

这是使用非虚拟接口(NVI)模式的示例。

简而言之 标头应为

Interface::setPtr(void * ptr) = 0 ;

BaseClass::setPtr(void * ptr) final;
BaseClass::setPtr_impl(void * ptr) = 0;

SpecificClass::setPtr_impl(void * ptr);

实施方式

BaseClass::setPtr(void * ptr) {
assert(ptr != nullptr);
setPtr_impl(ptr);
}

SpecificClass::setPtr_impl(void * ptr)
{
//actual code, ptr can not be null
}

所有这些都要求您没有使ptr失效的多线程。