5

std::cin 経由でユーザー入力を受け取る関数があります。

std::getline(std::cin, in);

正規表現と照合して、対応するデータ構造を作成します。次に、関数はこのデータ構造を返します。

私は boost.test を使用しており、いくつかの入力が与えられたときに出力データ型が正しいことを確認する単体テストを作成したいと考えています。ただし、入力が関数の引数として渡されないため、どうすればよいかわかりません。

編集:標準入力を介して関数に文字列を供給するブースト テスト ケースを作成する簡単な方法はありますか?

4

1 に答える 1

8

を呼び出す関数のソースコードにアクセスできる場合std::getline、最も簡単な解決策は、同じ署名と実装を持つ別の関数のラッパーとして書き直すことですがstd::istream&、の代わりに使用される追加のパラメーターを使用しますstd::cin。たとえば、現在次の場合:

my_struct my_func()
{
    //...

    std::getline(std::cin, in);

    //...
}

次に、次のように書き直します。

my_struct my_func(std::istream& is);

inline my_struct my_func()
{
    return my_func(std::cin);
}

my_struct my_func(std::istream& is)
{
    //...

    std::getline(is, in);

    //...
}

このように、オブジェクトをにmy_func渡すことにより、構築された入力シーケンスのコア機能をテストできます。std::istringstreammy_func(std::istream&)

を呼び出す関数のソースコードにアクセスできない場合、std::getline使用できる1つのトリックは、記述子の標準を置き換えることです。標準のout記述子を置き換え、それに応じて変更するコードについては、この回答を参照してください。

于 2011-03-08T00:01:12.717 に答える