2016-07-15 44 views
1

Myクラスのコンストラクタがファイルを開き、そこからデータを読み込みます。コンストラクタは引数をとりません。gtestを使ってコンストラクタ内の条件をテストする方法は?

ファイルのオープニング部分は、コンストラクタ内で実行する必要があります。

gtestを使ってそのようなコンストラクタ内の条件をテストする方法はありますか?

+0

コンストラクタをテストする場合は、エラーが発生した場合にコンストラクタをスローし、スローしないことをテストします。 あなたは、それを模擬してあなたのクラスをテストするためのより良いコントロールを持つことを可能にするために、 'stream'や他のインターフェースとして何らかの議論を取るように再設計したいかもしれません。 – Jarod42

+0

私は以前のコメント作成者と同意します。依存性注入を使用して、実際のファイルのオープンやエミュレートを行う実際のオブジェクトまたはモックを挿入します。 –

答えて

-1

クイックアンサー:あなたが提供した情報が提供されました。

ただし、開いたファイルハンドルや関連するフラグ/変数が保護されている場合、gtestの1つの技法はクラスから継承し、派生クラスを使用してそのデータにアクセスしてテストすることです。

サイドノートでは、コンストラクタはstuffを実行すべきではありません。あなたの例では、何らかの理由でファイルシステムを開くことができないと想像してください。これはクラスの振る舞いにどのように影響しますか?あなたは言い表せません。したがって、クラスから未定義の動作が発生する可能性があります。
同じ理由で例外をスローする例外の提案がさらに悪化します。コンストラクタで依存関係注入を使用するか、注入されたポリシーを制御できるようにクラスをテンプレートクラスにします。

+1

エラー条件を示すコンストラクタ内の例外をスローすることは、標準で受け入れられているコーディングパターンです。 – Smeeheey

+0

@Smeetheey:Web上で議論が行われています。例外をスローすることは標準ですが、外部からキャッチすることを覚えておく必要があります。つまり、クラスコンストラクタから副作用を引き受ける必要があります。 'init()'メソッドを使うことは有効ですが、マルチスレッド環境では注意が必要です。深い場合は、外部で何かする必要がありますが、コンストラクタをスローすると、クラスAPIには存在しない動作を想定する必要があります。これはある種の味です。 – fedino

+1

はい、それは選択の問題です。どちらのアプローチも有効ですが、人々はどちらか一方を選ぶことができます。だから私はあなたの答えにスローアプローチのあなたの無効化に同意しない。また、*「補足として、コンストラクタは物事を行うべきではありません」* - これは、受け入れられた事実として述べられた意見(RAIIを信じている人の顔に飛ぶもの)です。 – Smeeheey

関連する問題