k4200’s notes and thoughts

Programmer side of k4200

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

プログラムのテストとは、簡単に言うと以下の流れ。

  1. テストケースを書く(こういう入力を与えて、こういう処理を行う)
  2. 実際にプログラムをテストケースにそって動かす
  3. 予想される結果と実際の結果を比較する

という流れ。

で、これの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

長くなりそうなので、続きはまた今度。