c++ - {fmt}等同于cout.rdbuf?

标签 c++ fmt

我有一个单元测试,它通过读取函数发送的缓冲区来验证函数:

template <typename Manifold>
void print_manifold(Manifold const& manifold)
try
{
  std::cout << "Manifold has " << manifold.N0() << " vertices and "
            << manifold.N1() << " edges and " << manifold.N2() << " faces and "
            << manifold.N3() << " simplices.\n";
  // fmt::print(
  //    "Manifold has {} vertices and {} edges and {} faces and {}
  //    simplices.\n", manifold.N0(), manifold.N1(), manifold.N2(),
  //    manifold.N3());
}
catch (...)
{
  std::cerr << "print_manifold() went wrong ...\n";
  throw;
}  // print_manifold

和:
SCENARIO("Printing results", "[utility]")
{
  // redirect std::cout
  stringstream buffer;
  cout.rdbuf(buffer.rdbuf());
  GIVEN("A Manifold3")
  {
    Manifold3 const manifold(640, 4);
    WHEN("We want to print statistics on a manifold.")
    {
      THEN("Statistics are successfully printed.")
      {
        print_manifold(manifold);
        CHECK_THAT(buffer.str(), Catch::Contains("Manifold has"));
      }
    }
}

有没有办法捕获由fmt::print生成的输出到stdout的输出?

当我注释掉cout代码并取消注释fmt代码时,我得到了由cout <<的先前实例产生的缓冲区。

最佳答案

这比{fmt}问题更像是一个C stdio问题,但是您可以按照Redirecting stdout to pipe in C的答案中所述将stdout重定向到管道并从中读取输出。尽管这不是一个好的单元测试,因为它取决于全局状态,但是您当前的测试也存在相同的问题。

关于c++ - {fmt}等同于cout.rdbuf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59231840/

相关文章:

c++ - 如何将 double 格式格式化为十六进制?

c++ - 如何使用 fmt 库格式化指针?

c++ - 在 fmt 中强制对 std::string 进行 UTF-8 处理

c++ - ELF 文件中的 resolve 函数如何知道符号在哪些库中?

c++ - 如何以二进制输出int?

c++ - 如何为我的类(class)提供交换功能?

c++ - 如何减小可执行文件的大小?

c++ - 是否可以使用 fmt 格式化带有千位分隔符的数字?

c++ - 如何使用 mongocxx c++ 驱动程序递归生成 Mongodb 文档?

c++ - WTS连接 session