2

次のようなクラスがあります。

public class Processor
{
    //set timeout in seconds
    private const int TIMEOUT = 600;

    public void Process()
    {
        //DO SOMETHING HERE

        //CHECK TO SEE IF TIMEOUT HAS BEEN HIT
    }
}

基本的に、指定された時間が経過した後にタイムアウトが発生するかどうかを確認するための単体テストを作成します。もちろん、テストを実行するたびに10分待つ必要はありません。これを念頭に置いて、私の質問は次のとおりです。

この値を管理して、テストでは10秒、本番環境では10分になるようにするにはどうすればよいでしょうか。これを行うには多くの明白な方法がありますが、私は最もクリーンな方法が何であるかを判断しようとしています。これをプロパティとして公開する必要がありますか?コンストラクターパラメーターとして含めますか?メソッドパラメータとして含めますか?コンパイラ指令を使用しますか?

4

4 に答える 4

8

正確なシナリオでは、適切なサーバー(dev / whatever)のタ​​イムアウトを決定するappSettings変数があると思います。

#if DEBUGただし、一般的には、適切なタイミングでディレクティブを使用するのが非常に適切です。ただし、一般的には、リリースモードで、コード内の特定のコードのコンパイルを実際に防止したい場合にのみ使用します。

少なくとも私が見つけたときから、そのようなディレクティブを使用する典型的な理由は、リリースコードに含まれているステートメントのログ記録を完全に停止することです。もう1つは、すべてのプロジェクトに特定の一般的なライブラリを含めることができるが、その中の特定のコードは、展開先の特定のプラットフォームに関連しない場合です(つまり、Compact FrameworkにはXクラスがないため、ディレクティブを使用してCFモードを決定します。 、それに応じてコードを記述します)。

于 2009-09-11T03:13:42.060 に答える
3

私はそのコードがタイムアウトをチェックすることをあざけるでしょう。

このコードに似たものがある場合:

public class Processor
{
    //set timeout in seconds
    private const int TIMEOUT = 600;

    public void Process(ITimeout timeout)
    {
        //DO SOMETHING HERE

        timeout.CheckTimeout(TIMEOUT);
    }
}

public interface ITimeout
{
    bool CheckTimeout(int timeout);
}

CheckTimeoutメソッドをモックできます。

次のようなモッククラスを作成できます。

public class TimeoutMock : ITimeout
{
    public bool TimeoutExpired;

    public bool CheckTimeout(int timeout)
    {
        return TimeoutExpired;
    }
}

そして、テストは次のようになります。

[TestMethod]
public void TimeoutExpires()
{
    var processor = new Processor();
    var mock = new TimeoutMock();
    mock.TimeoutExpired = true;
    processor.Process(mock);
}
于 2009-09-11T03:17:00.600 に答える
0

それをコンストラクターパラメーターとして含めるのが私の好みです。

#if debugディレクティブの問題は、正しいシンボルが定義されていないと、簡単に壊れてしまうことです。さらに、これらは通常、リリースからコードを除外する(またはデバッグにコードを含める)ために使用されます。テストが難しくなり、副作用のあるコードがデバッグで呼び出されたがリリースでは呼び出されなかった場合に微妙なエラーが発生することがわかりました(最近ではありません)。

于 2009-09-11T03:12:45.663 に答える
0
#if DEBUG
const int TIMEOUT = 60;
#else
const int TIMEOUT = 600;
#endif

これは大きな問題ではないと思います。実行時にビルドターゲットを定義する他の方法がない限り、どこかでプリプロセッサを使用する必要があります。

于 2009-09-11T03:14:58.470 に答える