C++ 谷歌测试C++;:有没有办法在测试中读取当前控制台输出?

C++ 谷歌测试C++;:有没有办法在测试中读取当前控制台输出?,c++,googletest,C++,Googletest,假设我有一个待测试类,它具有以下方法: void MyClass::sayHello() { std::cout << "Hello"; } 感谢您的反馈 我避免使用类似您的sayHello()方法的代码。我会将其重构为如下内容: void MyClass::sayHello(std::ostream& out) { out << "Hello"; } 在这种情况下,我将避免重定向或测试stdout或stderr中的值,因为对这些流的访问不是线程

假设我有一个待测试类,它具有以下方法:

void
MyClass::sayHello()
{
   std::cout << "Hello";
}

感谢您的反馈

我避免使用类似您的
sayHello()
方法的代码。我会将其重构为如下内容:

void MyClass::sayHello(std::ostream& out) {
    out << "Hello";
}

在这种情况下,我将避免重定向或测试stdout或stderr中的值,因为对这些流的访问不是线程安全的,因为输出缓冲区可能不会像预期的那样被追加和刷新

从测试的角度来看,我建议将方法重构为无状态,并将状态(又称std::cout)保留在其他地方。在您的示例中,您开始测试外部API的行为,而不是对象中的实际修改

class MyClass {

    std::sstream state;

public:

    void print(){ std::cout << state.str(); } // no need to test this method, only external API

    void changeState() {
        state << "Hello" << std::endl; // this should be tested 
    }

}

您还可以重定向stdout并检查输出。看见
TEST(MyClassTest, sayHello) {
  MyClass c;
  std::stringstream strm;
  c.sayHello(strm);
  EXPECT_STREQ("Hello", strm.str.c_str());
}
class MyClass {

    std::sstream state;

public:

    void print(){ std::cout << state.str(); } // no need to test this method, only external API

    void changeState() {
        state << "Hello" << std::endl; // this should be tested 
    }

}
// Tests if sayHello() outputs Hello
TEST(MyClassTest, sayHello)
{
  myClass.changeState();
  EXPECT_STREQ(myClass.state.str().c_str(),"Hello");
}