2009-07-27 6 views
0

私は、Visual Studio 2008の組み込みユニットテストフレームワークを使用して単体テストしたい接続プールを表す静的クラスを持っています。静的クラスには、最大許容接続のようないくつかの定数があります。私はユニットテストのためにこの値を減らしたいので、テスト条件(具体的には、最大許容接続に達したときのコード)を打つために、たくさんの接続を開く必要はありません。単体テストでこの定数を編集できる方法はありますか?それは私にとって可能ではないようです。C#のユニットテスト用の静的クラスの定数を調整する

解決策の1つは、テストするコードにアクセスするためのもう1つの方法、「最大許容接続」をパラメータとして使用する方法です。それは少しでも汚れているように見えますが、テストしたいコードを修正します。しかし、より良い選択肢はありますか?ここでは参考のために、私のコードの一部です:

internal static class ConnectionPool<T> where T : Connection, new() 
{ 
    private const int MAX_OBJECTS = 25; 
    private static int _totalConnections; 

    internal static T getConnection(bool testMode) 
    { 
     if (_totalConnections >= MAX_OBJECTS) 
     { 
      // Here's the code I want to test 
     } 
    } 
} 

答えて

0

テスト対象コードの条件には2つの部分があります。定数はMAX_OBJECTSですが、その1つはtrueですが、_totalConnectionsもあります。プライベートメソッドと変数にアクセスするためにVisual Studioが生成するアクセサークラスをConnectionPoolの範囲で使用すると、if (_totalConnections >= MAX_OBJECTS)をtrueにするために_totalConnectionsの値を変更できます。言い換えれば、ユニットテストの静的クラスに嘘をついて、条件を満たすためにMAX_OBJECTS接続を作成する必要はありません。

2

いいえ、あなたは一定で変更することはできませんが、あなたは、静的な読み取り専用フィールドでそれを交換し、リフレクションを使用して、そのフィールドを変更することができます。

2

これを行う前に、この制限の重要性について質問し、テストの性質を変更することで変更する場合は、つまり、MAX_OBJECTSを5に変更すると、リソースの競合やマルチスレッドの問題によって発生する問題に対して、私のコードが多かれ少なかれ脆弱になりますか?それはあまりにも遅すぎるか、あまりにも実用的でないため、あなたは「本当の」状態をテストすることを避けていますか?もしそうなら、これを別の単位テストのクラスとして扱うのが最善でしょう。私が働いているところでは、重要なテストがありますが、時間がかかります。常に残しておくと、継続的な統合は実用的ではないため、NUnitカテゴリ「Nightly」を作成し、1分以上かかるテストにはNightlyでCategory属性を指定する必要があります。

+0

"実際の状態が遅すぎるか実用的でないため、テストすることを避けていますか?"はい。ユニットテストを毎晩vごとに分離することについての良い提案。 –

2

設定ファイルから取得できます。テスト用に異なる値を設定できます。