Liftアプリのテストその1
Liftアプリをテストしたい
一度に複数のことを勉強できないので、引き続きLift関係を触ったり勉強したりしてる。今回はLiftアプリのテストに関して少し書こうかなと。
LiftのプロジェクトのテンプレートだとSpecsが使えるようになってるので、とりあえずSpecsで簡単なテストケースを書いてみる。
その前に環境を。
- Scala 2.8.1
- Lift 2.2
- Specs 1.6.6
- sbt 0.7.4
で、コードはこんな感じ。
import org.specs._ object FooClassSpec extends Specification { "methodBar" should { "retrun the same value as the argument." in { val fooClass = new FooClass fooClass.methodBar(1) mustEqual 1 fooClass.methodBar(-1) mustEqual -1 } } }
こんなのは、自分がわざわざ書かなくても、この辺を見ればOK。
Matcher
プログラムのテストとは、簡単に言うと以下の流れ。
- テストケースを書く(こういう入力を与えて、こういう処理を行う)
- 実際にプログラムをテストケースにそって動かす
- 予想される結果と実際の結果を比較する
という流れ。
で、これの3番「予想される結果と実際の結果を比較する」時に使うのがmustEqualなどのMatchersと呼ばれるもの。
ドキュメントのこの辺りに情報がある。
LiftのBox型の場合
先ほどのドキュメントではOption型の場合の例が載ってるが、Specsにはmust beNoneとかのOption型専用のmatchersが用意されているらしい。が、Liftで良く使われるBox型にはそういうのは用意されていないので、どうやればいいかを以下に記載。
あるケースで戻り値がFull[String]が期待される場合は以下の通り。
retval must haveClass[Full[String]]
同様にEmptyが返ってくるかどうかをチェックしたい場合は以下の通り・・・ではだめ。
retval must haveClass[Empty] //コンパイルエラー
エラーメッセージはこんな感じ
[info] Compiling test sources... [error] /path/to/src/test/scala/code/model/UserConfig.scala:31: not found: type Empty [error] retval must haveClass[Empty] [error] ^ [error] one error found
// パッケージ名指定してもコンパイルエラー
retval must haveClass[net.liftweb.common.Empty]
[info] Compiling test sources... [error] /path/to/src/test/scala/code/model/UserConfig.scala:29: type Empty is not a member of package net.liftweb.common [error] retval must haveClass[net.liftweb.common.Empty] [error] ^ [error] one error found
理由は、Emptyはクラスではなくてcase objectなので。以下のようにすればOK。
retval mustBe Empty //OK
長くなりそうなので、続きはまた今度。