测试时全局禁用c++ std::cout
globally suppress c++ std::cout when testing
我有一个Struct点在数值数据与一个returnNext()方法,返回和职位在stdout下一个数据每次调用。我还有一系列使用此方法的单元测试:在这些测试中,我想抑制所有Data的std::cout,以便我只检查返回值的有效性,而不会用消息填充屏幕。例如
struct Data {
Data(int n): datum{n} {};
int datum;
int returnNext() {
std::cout << datum << " returned" << std::endl;
return datum;
}
}
// main.cpp
int main() {
Data d{100};
d.returnNext(); // I want this to print at the screen
return 0;
}
// test.cpp
int main() {
TEST( ... ) {
Data d{100};
ASSERT_THAT(d.returnNext(), 100); // I want just to check the output, not to check
}
std::cout << "some message" << std::endl; // I want this printed
return 0;
}
一个明显的解决方案是使用预编译器标志/命令从测试构建中排除std::cout。但这将需要编辑几个模块,也会使我的代码变得丑陋。
另一种情况是从控制台使用重定向标准输出到dev/null,但这也会抑制测试模块的标准输出。
在程序生命周期的特定时刻,是否有一种方法可以编程地抑制/重定向标准输出?
对于抑制std::cout
的一般问题,您可以使用带有空缓冲区的std::basic_ios::rdbuf
:
auto old_buffer = std::cout.rdbuf(nullptr);
要恢复它,只需执行
std::cout.rdbuf(old_buffer);
这就是为什么在成员函数中硬编码标准输出输出是一个坏主意的原因。现在你认为你必须全局阻止std::cout
,因为你的类的行为是不灵活的。
相反,将std::cout
调用移动到其他地方(使其使用可选)或将其作为任意的std::ostream
,您可以将其路由到任何地方。
相关文章:
- std::cout.imbue()多重调用
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- std::cout输出int时出现编译错误
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- main() 中的 std::cout 在调试期间不会在调试控制台中打印任何内容
- std::cout 来自多个线程
- 在 c++ 中以十六进制格式打印无符号字符(BYTE).使用 std::cout
- Cuda 基本程序 (将值写入矩阵和 std:cout 不起作用) ;主功能不启动
- 是否可以为 std::cout 创建别名?
- std::cout 在打印变量与函数表达式时的行为不同
- 带有 std::cout 的多线程控制台文本动画
- 捕获/禁止发送到 std::cout 的 OpenCV 警告
- printf() 和 std::cout 在指针方面的区别
- 使用字符串流加速 std::cout 日志记录
- 是否可以在每次使用std::cout时执行一个函数
- 为什么'std::cout << !+2 '输出 0?
- 如何将自定义类传递给std::cout
- 对于输出,std::copy是否比std::cout快