测试时全局抑制c ++ std :: cout

Mar*_*s K 3 c++ iostream c++11

我在数值数据上有一个Struct点,带有一个returnNext()方法,该方法每次调用时都会在stdout中返回AND post.我还有一系列使用这种方法的单元测试:在那些测试中我想要压缩所有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;
}
Run Code Online (Sandbox Code Playgroud)

一个明显的解决方案是使用预编译器标志/命令从TEST构建中排除std :: cout.但这需要编辑几个模块,并且还会使我的代码变得丑陋.

另一种情况是从控制台使用重定向stdout到dev/null,但这也会抑制stdout我的测试模块.

是不是有一种方法可以在程序的生命周期中的特定时刻以编程方式抑制/重定向标准输出???

lis*_*rus 10

对于抑制的一般问题std::cout,您可以使用std::basic_ios::rdbuf空缓冲区:

std::cout.rdbuf(nullptr);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,此过程是_reversible_ - `rdbuf()`返回上一个流缓冲区,因此您可以保存此函数的返回值,然后再恢复. (2认同)

Lig*_*ica 5

这正是为什么在您的成员函数中使用硬编码 stdout 输出是一个坏主意的原因。现在你认为你必须std::cout全局阻塞,因为你的类的行为是不灵活的。

相反,将std::cout调用移到其他地方(使其使用可选)或使其成为任意的std::ostream,您可以将其路由到任何地方。