【问题标题】:Checking printf output in CppUnit检查 CppUnit 中的 printf 输出
【发布时间】:2014-10-27 00:17:04
【问题描述】:

假设我有一个简单的 HelloWorld 类,它带有一个 hi() 方法和以下单行代码:

void HelloWorld::hi(){
    printf("Hi!\n");
}

现在假设我想用 CppUnit 测试该方法。

void HelloWorldTests::testHi() {
    HelloWorld hw;
    hw.hi(); // <------ ????
    // <------ ?????
    CPPUNIT_ASSERT(/*????*/);
}

如何捕获hi() 方法的输出,以便将其与 CppUnit 中的固定值进行比较?

【问题讨论】:

  • hi() 没有输出。你想抓"Hi\n"吗?
  • @herohuyongtao 是的,没错。我想抓住Hi\n,这样我就可以比较它了。
  • @herohuyongtao 我宁愿避免更改项目中的所有方法。没有办法捕捉输出吗?
  • @alexandernst 在 c++ 中使用 printf 并给自己带来麻烦时称 +12 回答垃圾是......勇敢的。这实际上是printf 的正确答案。

标签: c++ cppunit


【解决方案1】:

没有标准方法可以在程序中将输出捕获到stdout。您可以使用freopen(filename, "w", stdout) 将输出重定向到stdout 到一个文件,然后比较文件的内容。这种方法的主要问题是没有标准的方法来恢复原始目的地。

我建议将代码更改为使用std::cout,因为这可以使用rdbuf() 成员轻松重定向到合适的std::streambuf,例如std::stringbuf。写入std::cout的方法完成后,可以保留和恢复原始流缓冲区:

struct HelloWorld {
    void hi() {
        std::cout << "hi";
    }
};

bool test_hi() {
    std::ostringstream out;
    std::streambuf* orig_buf(std::cout.rdbuf(out.rdbuf()));

    HelloWorld hw;
    hw.hi();

    std::cout.rdbuf(orig_buf);

    return out.str() == "hi";
}

【讨论】:

  • 我不知道 CppUnit,但发布的方法应该独立于测试框架工作。可以改进为自动安装/卸载流缓冲区并使用自定义比较流缓冲区避免字符串流,但基本方法不会改变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多