Lift でリクエストを取り扱う snippet のテストを書く。

Scala+Lift 関連目次

Lift でリクエストを取り扱う snippet のテストをどう書けばいいのか悩んでいたんですが、Lift が HTTPRequest をモックするツールを提供していたのでそれを使ってみました。

参考 : Mocking HTTP Requests

例えばこんな snippet を書いた場合、、

[code language="scala"] package info.ukikusa.snippet

import scala.xml.{NodeSeq, Text, Group}
import net.liftweb.http._

class FooBar {

def foobar() : NodeSeq = { var foo = S.param("foo").openOr("") <p>{foo}</p> } } [/code]

テストコードはこんな風に…

[code language="scala"] package info.ukikusa.snippet

import org.specs.runner.JUnit4
import net.liftweb.http.{S, LiftSession}
import net.liftweb.util._
import net.liftweb.common._
import net.liftweb.mockweb.WebSpec
import net.liftweb.mocks._
import bootstrap.liftweb._

// mvn からテストを実行できるようにJunitでラップする class FooBarTest extends JUnit4(FooBarSpec)

// net.liftweb.mocweb.WebSpec を継承する。 object FooBarSpec extends WebSpec {
var session = new LiftSession("", StringHelpers.randomString(20), Empty)

new SpecContext{ beforeSpec { // 初期処理。 // DBコネクションとか欲しければ boot を実行しておく。 // (new Boot).boot } afterSpec { // 終了処理。何かあれば書く。 } }

// テスト用のリクエストURL。ドメイン部分は適当でいい? val testReq = new MockHttpServletRequest("http://localhost:8080/test/snippet?foo=bar";, "/test")

"fooに渡した値が表示される" withSFor(testReq) in { val snippet = new FooBar() val output = snippet.foobar() output must_== <p>bar</p> } } [/code]

net.liftweb.mocweb.WebSpec を継承してSpecを作成する。WebSpec自身が org.specs.Specification を継承しているので、Specs っぽく書ける。
あとはリクエストURLを宣言して、withSFor でURLを渡してあげればOK。 ただ、、POSTで送信する方法がまだちょっとわからない。。

あ、あと、WebSpec を使うには lift-testkit が入ってないと怒られてしまいます。そのままでも net.liftweb.mocweb.WebSpec は見えるけど、net.liftweb.mocks がないとか言って実行時に怒られました。lift-testkit が入ってなかったら pom.xml に以下を追加しましょう。

[code language="xml"] <dependency> <groupId>net.liftweb</groupId> <artifactId>lift-testkit_2.9.1</artifactId> <version>2.4-M5</version> </dependency> [/code]