如何在C ++ Gtest中测试输入和输出重载的运算符

时间:2015-08-04 17:04:12

标签: c++ operator-overloading googletest

我正在使用here

中的以下示例

考虑我有以下课程

#include <iostream>

class Distance {
private:
  int feet;             
  int inches;           

public:
  Distance()             : feet(), inches() {}
  Distance(int f, int i) : feet(f), inches(i) {}

  friend std::ostream &operator<<( std::ostream &output, const Distance &D )
  { 
     output << "F : " << D.feet << " I : " << D.inches;
     return output;            
  }

  friend std::istream &operator>>( std::istream  &input, Distance &D )
  { 
     input >> D.feet >> D.inches;
     return input;            
  }
};

我正在使用Gtest来测试这门课程。

但我找不到更好的方法来测试它。

我可以使用gtest ASSERT_NO_THROW中提供的宏,但它不会验证值。 我有什么方法可以使用EXPECT_EQ代替吗?

谢谢

2 个答案:

答案 0 :(得分:3)

  

我有什么方法可以使用EXPECT_EQ吗?

您可以使用stringstreamoperator<<的结果打印到字符串,然后比较字符串。

https://en.cppreference.com/w/cpp/io/basic_stringstream

TEST( Distance, Output )
{
    std::ostringstream out;
    Distance d;
    out << d;
    EXPECT_EQ( "F:0 I:0", out.str() );
}

输入测试类似,只需使用std::istringtream

答案 1 :(得分:2)

您想对运营商进行测试?

  • 写入或读取后,流处于良好状态。
    你可以检查一下。

  • 输出操作符为特定距离写入特定字符串。
    您可以写入std::ostringstream并将调用其str()成员的结果与您的期望进行比较来完成此操作。

  • 输入迭代器读取特定字符串的特定距离。
    你可以使用用字符串初始化的std::istringstream来比较从它读取的距离和你期望的距离。

  • 班上吃自己的狗粮。
    使用std::stringstream写入,然后从中读取,并将您阅读的内容与您所写的内容进行比较 注意:这将失败。