gpt4 book ai didi

c++ - 如何在 Windows 中管理 googletest 中的断言

转载 作者:太空宇宙 更新时间:2023-11-04 12:44:22 24 4
gpt4 key购买 nike

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

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

现在我想为此接口(interface)函数编写一个单元测试,我正在使用 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);在报告 Hook 函数中。

最佳答案

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

check that any derived class implements a function a certain way

如果每个派生类在被赋予 nullptr 作为输入参数时都必须抛出异常,那么您可能希望在接口(interface)和实际实现类之间有一个基类,它在调用特定的派生类方法之前完成一次工作。

这是使用非虚拟接口(interface) (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 无效的多线程。

关于c++ - 如何在 Windows 中管理 googletest 中的断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52440948/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com