如何在 google test in windows 中管理断言
How to manage assertions in googletest in windows
我正在使用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"
窗口。
禁用此窗口的最佳方法是什么?我一直在想谷歌测试可能会以某种方式解决这个问题。
_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(。
这与问题没有直接关系,但看起来这是一个 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 无效的多线程。
执行std::abort(-1);
以退出提供给_CrtSetReportHook
的函数似乎可以使一切正常工作。
这是有效的,因为googletest生成了另一个进程来执行测试(使用EXPECT_DEATH(。它实际上期待这种情况发生。
相关文章:
- Windows 资源管理器中的图标在使用 resource.rc 时显示 2 个不同的图标
- 如何在 google test in windows 中管理断言
- c ++ 是否有任何用于列出 Windows 驱动程序管理器控制台中显示的设备驱动程序的 Windows API?
- 如何在 Windows 上的 c++ 中管理文件/目录的发现和使用
- Windows 资源管理器打开文件夹还原
- Windows HANDLE RAII 管理,如果返回布尔值而不是句柄怎么办?
- 如何在 Windows 资源管理器中捕获用户的左键单击?
- 如何在Windows上使用MakeFile编译不受管理的 *.dll
- 在XP上使用windows文件资源管理器时,停止打开explorer.exe任务栏
- Windows 资源管理器右键单击文件和文件夹的上下文菜单
- Windows 资源管理器覆盖图标 - 如何开始
- IShellFolder.EnumObjects-windows资源管理器上的异步
- QTreeWidget:类似于Windows资源管理器的编辑
- MFC:类似于Windows资源管理器的应用程序,可以与主线程并行导出文件
- 如何在C++中访问Windows设备管理器中的信息
- 在Windows 7中管理应用程序音量
- 无法在Eclipse中运行SDL程序,但可以在Windows资源管理器中运行
- Linux独立于windows管理器在屏幕上绘制
- 是否有可能由windows管理的2个窗口具有相同的窗口句柄值?
- 如何使用WMI (Windows管理工具)获得特定设备使用的内存范围