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); 在报告挂钩函数中。
解决方案
退出std::abort(-1);
给定的功能_CrtSetReportHook
似乎可以使一切正常工作。
这是因为 googletest 产生了另一个进程来执行测试(使用 EXPECT_DEATH)。它实际上期待这种情况发生。
推荐阅读
- javascript - Angular HTTP 请求延迟拦截器未按预期工作
- python - 如何在 VGG16-CNN 中一次输入多张图像?
- java - 致命错误编译:不支持使用 IntelliJ IDEA 和 Maven 发布版本 10.0.1
- angular - Angular 8/9 为什么经过身份验证和管道图像 url 在 Typescript 中返回空图像 blob
- stripe-payments - 如何强制 Stripe subscription.trial_will_end 事件在 7 天前而不是 3 天前触发
- c++ - 在其他自定义类的成员函数原型的参数中引用自定义类。如果变成圆形怎么办?
- php - 使用 php.ini-production 和 php.ini-development -> php.ini 会破坏 Kubernetes 环境变量
- ruby-on-rails - Heroku rails 应用程序在本地运行,但在打开时给出应用程序错误代码 H10
- python - BeautifulSoup 检测更改触发器
- python - 如何通过python程序从github检索文件