首页 文章

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

提问于
浏览
1

我正在使用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 回答

  • 0

    执行 std::abort(-1); 退出给予 _CrtSetReportHook 的函数似乎使一切正常 .

    这是有效的,因为googletest会生成另一个进程来执行测试(使用EXPECT_DEATH) . 它实际上期待这种情况发生 .

  • 0

    这与问题没有直接关系,但看起来这是一个XY问题 . 真正听起来像代码味道的是:

    检查任何派生类是否以某种方式实现函数

    如果每个派生类都必须抛出,如果它们被赋予nullptr作为输入参数,那么您可能希望在调用特定派生类方法之前,在接口和执行作业一次的实际实现类之间有一个基类 .

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

    简而言之, Headers 就是

    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无效的多线程 .

相关问题