2

次のメソッドを持つテスト対象のクラスがあると仮定します。

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

さて、私のグーグルテストの中で、この出力が行われたことを確認したいと思います。以下の擬似コードで使用されているlastConsoleOutputと同等のものは何でしょうか?

// Tests if sayHello() outputs Hello
TEST(MyClassTest, sayHello)\
{
  EXPECT_EQ(lastConsoleOutput,"Hello");
}

フィードバックありがとうございます!

4

2 に答える 2

3

この場合、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 
    }

}

テストコードで、次を使用してテストを簡単に実行できるようになりました

// Tests if sayHello() outputs Hello
TEST(MyClassTest, sayHello)
{
  myClass.changeState();
  EXPECT_STREQ(myClass.state.str().c_str(),"Hello");
}
于 2011-04-17T17:58:08.063 に答える
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());
}
于 2011-04-06T18:46:32.580 に答える