如何在重用std :: stringstream变量时避免使用std :: stringstream.str()和std :: stringstream.clear()?

时间:2017-06-20 21:27:25

标签: c++ c++11 operator-overloading googletest stringstream

我这样重载了operator<<

std::ostream& operator<<(std::ostream& os, SomeClass C){ 
//SomeClass is the class to be represented with operator overloading
os << "{ ";
os << C.getPropertyA() << " ";
os << C.getPropertyB() << " }";
//getPropertyA(), getPropertyB():functions of 'SomeClass' that return std::string
return os;
}

现在我正在使用 googletest 来测试operator<<这样的重载:

SomeClass C1;
SomeClass C2;
.
.
std::stringstream ss;
std::string str;

//First test
ss << C1;
std::getline(ss, str);
EXPECT_EQ("<some expected value>", str); // googletest test

//Second test
ss.str("");ss.clear(); //Mandatory if 'ss' need to be reused
ss << C2;
std::getline(ss, str);
EXPECT_EQ("<some expected value>", str); // googletest test
.
.
//Some more use 'ss' follows

现在问题是我每次添加新测试时都需要在测试前添加ss.str("");ss.clear();,显然是为了清空清除错误状态。这两个std::stringstream函数的重复调用让我觉得我做错了。

因此我主要需要帮助:

  • 如何重复使用std::stringstream变量's'而不再一次调用ss.str("");ss.clear();
  • 使用 googletest 为重载operator<<实施测试的最佳替代方案。

1 个答案:

答案 0 :(得分:5)

您不需要来自字符串流的getline,因为您可以直接访问底层存储。更简单的方法是为每个测试创建新的stringstream

//First test
{
    SomeClass C1;
    .
    std::stringstream ss;
    ss << C1;
    EXPECT_EQ("<some expected value>", ss.str()); // googletest test
}

//Second test
{
    SomeClass C2;
    .
    std::stringstream ss;
    ss << C2;
    EXPECT_EQ("<some expected value>", ss.str()); // googletest test
}