3

これは単体テストとの最初の出会いであり、単純な日付検証でこの概念をどのように使用できるかを理解しようとしています。

ユーザーは、支払いが可能になるまでの日付を表す ToDate を選択できます。私たちの日付が有効でない場合、支払いはできません。

    private void CheckToDate(DateTime ToDate)
    {
        if (Manager.MaxToDate < ToDate.Year)
            //show a custom message
    }

この場合、単体テストはどのように使用できますか?

よろしく、

アレックス

回答ありがとうございます:

多くの人が示唆しているように、関数を分割し、検証をメッセージ表示から分離し、このためだけに単体テストを使用します。

public bool IsDateValid(DateTime toDate)
{
    return (Manager.MaxToDate < toDate.Year);
}
4

4 に答える 4

2

確かに:-)カスタムメッセージが表示されていることを検出するには、少しトリックが必要になる場合があります(GUIに表示されるメッセージボックスを意味すると思いますが、メッセージが異なって表示されても考え方は同じです)。

単体テストからメッセージ ボックスを検出することも、単体テストから GUI 環境全体を起動することもできません。これを回避する最も簡単な方法は、メッセージ ボックスを表示する実際のコードを別のメソッド (理想的には別のインターフェイス) で非表示にすることです。次に、単体テスト用にこのインターフェイスのモック実装を挿入できます。このモックは何も表示せず、渡されたメッセージを記録するだけなので、単体テストで確認できます。

もう1つの問題は、あなたの方法がprivate. 最初に、どこから呼び出されているか、パブリック メソッドを介してあまり複雑にせずに呼び出せるかどうかを確認します。そうでない場合は、単体テストを有効にするために (一時的に) 公開する必要がある場合があります。プライベート メソッドを単体テストする必要性は、通常、設計上の臭いであることに注意してください。クラスは、あまりにも多くのことをしようとしていて、あまりにも多くの明確な責任を負っている可能性があります。その機能の一部を個別のクラスに抽出して公開できる場合があるため、直接単体テストが可能になります。ただし、リファクタリング時に何かを壊していないことを確認するために、最初にこれらの単体テストを行う必要があります。

次にManager.MaxToDate、テストの前に適切な日付を設定しCheckToDate、さまざまなパラメーターを使用して呼び出し、結果が期待どおりであることを確認する必要があります。

同様のトリックなどについて推奨される読書は、レガシー コードを効果的に使用するです。

于 2011-02-15T08:38:10.063 に答える