让我们假设我有一个具有以下方法的测试类:
void
MyClass::sayHello()
{
std::cout << "Hello";
}
现在,在我的谷歌测试中,我想验证此输出已经完成。 lastConsoleOutput 等价物在我的伪代码中使用的是什么?
// Tests if sayHello() outputs Hello
TEST(MyClassTest, sayHello)\
{
EXPECT_EQ(lastConsoleOutput,"Hello");
}
感谢您的任何反馈!
答案 0 :(得分:3)
在这种情况下,我会避免重定向或测试stdout或stderr中的值,因为对这些流的访问不是线程安全的,因为输出缓冲区可能无法追加并按可能预测的方式刷新。
从测试角度来看,我建议将该方法重构为无状态,并将状态(a.k.a.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
}
}
在您的测试代码中,您现在可以使用
轻松执行测试// Tests if sayHello() outputs Hello
TEST(MyClassTest, sayHello)
{
myClass.changeState();
EXPECT_STREQ(myClass.state.str().c_str(),"Hello");
}
答案 1 :(得分:2)
我避免使用像sayHello()
方法这样的代码。我会将它重构为:
void MyClass::sayHello(std::ostream& out) {
out << "Hello";
}
然后测试方法是这样的:
TEST(MyClassTest, sayHello) {
MyClass c;
std::stringstream strm;
c.sayHello(strm);
EXPECT_STREQ("Hello", strm.str.c_str());
}