[コラム] どうやって DateTime.Now を含むメソッドをテストする?
TDD Boot Camp でも、 演習の後半に出てきました。 テスト対象のメソッドが、 現在時刻や時間経過に依存しているときは、 どうやったら上手くユニット テストが書けるでしょう?
テストしたい時刻になるまで、 あるいは、 テストしたい時間が経過するまで Sleep() しますか? そんなことをしていたら、 DateTime.Now に依存するメソッドのテストに、 ヘタをすると丸一日掛かってしまうかもしれませんね。
DateTime.Now の値を自由にコントロールできれば、 問題は解決するでしょう。
製品コードの中で、 現在時刻を提供する部分を切り出してしまい、 テストのときはそこをスリ換えてしまうというテクニックがあります。
・ 製品コードに、 現在時刻を提供するクラスを作って、 テストのときはクラスを入れ換える。 (ちょっと大げさだけど、 大きなアプリケーションならけっこう現実的。)
・ 製品クラスの中で、 現在時刻を提供するメソッドかプロパティを切り出して、 テストの時にはそこをすげ替える。
・ 製品クラスの中に、 #if DEBUG で括って、 時刻を調整できるメソッドを仕込んでおく。
・ (…ほかにも方法はあるでしょう。)
以下、 2番目のテクニックを紹介します。
| 固定リンク
| コメント (0)
| トラックバック (0)


最近のコメント