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");
}