2016-06-29 6 views
2

私は現在、いくつかのレガシーコードの単体テストを作成しようとしています。私の関数の1つでは、別の関数を呼び出します。内部関数の戻り値によれば、3つの分岐条件が存在する。コードはC++で書かれており、私はcxxtestフレームワークを使用しています。内部関数の戻り値をどのように操作しなくても、すべての分岐条件を通過できるようにするにはどうすればよいですか?私は、関数間の依存関係を避けることを好む。これを行う方法はありますか?ユニットテストの内部関数の戻り値を操作しますか?

答えて

2

すでに機能間の依存関係があります。一方は他方を呼び出します。

解決策は、内部関数をパラメータとして取るために外部関数を変更することです。次に、テスト時に好きな値を返し、残りのアプリケーションで有用な関数を返す関数を渡すことができます。おそらくコンパイル時にバインドします。

struct inner_function {int operator()();} 
struct mock {int operator()();} 

template <typename F = inner_function> 
int outer_function() 
{ 
    if (F {}()) 
     return 1; 
    else 
     return 2; 
} 


// in a test 
int r = outer_function <mock>(); 

ご希望の場合は、関数ポインタを実行時にこれを行うことができます。おそらくクライアントコードからテンプレートを隠すために別のラッパーを追加するでしょう。

+0

コードを編集できません。それは不可能。 – aaroh

+0

コードはいつでも編集できます。ソースを変更することは、必要ならば上のマクロを使用して、最も賢明な計画ですが、ビットコードをコンパイルしてビットコードをハックアップしたり、アセンブリをコンパイルしてアセンブリをハックアップしたり、極端な場合は、バイナリ自体。上のいずれかを実行したくない場合は、デバッガをスクリプト化して、その場で命令を変更することができます。コードを編集することは常に可能です。 –

関連する問題