§アプリケーションのテスト
テストのソースファイルは test
フォルダに配置します。 Play コンソールで test
(すべてのテストを実行します) や test-only
(test-only my.namespace.MySpec
のようにして、ひとつのテストクラスを実行します) タスクを実行すると、テストを実行することができます。
§specs2 を使う
Play 2 アプリケーションのテストは、デフォルトで specs2 を使います。
specs2 でクラス単体の仕様を記述する場合は、org.specs2.mutable.Specification
trait を継承したクラス内で、 should/in のフォーマットを使って記述します。
import org.specs2.mutable._
import play.api.test._
import play.api.test.Helpers._
class HelloWorldSpec extends Specification {
"The 'Hello world' string" should {
"contain 11 characters" in {
"Hello world" must have size(11)
}
"start with 'Hello'" in {
"Hello world" must startWith("Hello")
}
"end with 'world'" in {
"Hello world" must endWith("world")
}
}
}
§フェイクアプリケーション上で実行する
起動中のアプリケーションに依存するコードをテストする場合は、WithApplication
で囲まれたスコープで簡単にフェイクアプリケーションを実行することができます。
"Computer model" should {
"be retrieved by id" in new WithApplication {
val Some(macintosh) = Computer.findById(21)
macintosh.name must equalTo("Macintosh")
macintosh.introduced must beSome.which(dateIs(_, "1984-01-24"))
}
}
暗黙的に利用可能な app
を使って、フェイクアプリケーションに直接アクセスすることができます。
このフェイクアプリケーションに対して設定値を追加 (または上書き) したり、プラグインをモックすることも可能です。例えば、 default
という名前の インメモリデータベースに接続された FakeApplication
を起動する場合は、次のように書きます。
"be retrieved by id" in new WithApplication(FakeApplication(additionalConfiguration = inMemoryDatabase())) {
...
}
§同じ仕様で複数のテストを実行する
ユニットテスト仕様 (このページの最初の部分を見てください) において、should
メソッドを使って Example
のグループを作り、in
メソッドを使って Result
を含む Example
を作ります。Play アプリケーションが起動している必要のある複数のテストのグループを作りたい場合、このアプリケーションを共有することはできず、以下のようにして、それぞれのテスト毎に新しいアプリケーションを提供しなければなりません:
"Computer model" should {
"be retrieved by id" in new WithApplication {
// テストコード
}
"be retrieved by email" in new WithApplication {
// テストコード
}
}
テストを実行する前に、起動済みのアプリケーションを使っていくつかの操作を実行したいケースもいくつかあります。Specs2 を使えば、以下のようにして組み込みの arounds を拡張することすらできる org.specs2.specification.Around
を独自に実装することで、コードを取り出すことができます:
abstract class WithDbData extends WithApplication {
override def around[T](t: => T)(implicit evidence: (T) => Result) = super.around {
prepareDbWithData()
t
}
}
"Computer model" should {
"be retrieved by id" in new WithDbData {
// テストコード
}
"be retrieved by email" in new WithDbData {
// テストコード
}
}
§コントローラのユニットテスト
Play においてコントローラはオブジェクトとして定義されているので、トリッキーなユニットテストを行うことができます。Play 2.1 では、この負担は DI で軽減することができます。コントローラのユニットテストを手際よく行う別の方法は、コントローラに対する 明示的で型安全な参照 と共にトレイトを使う方法です:
trait ExampleController {
this: Controller =>
def index() = {
...
}
}
object ExampleController extends Controller with ExampleController
そして、このトレイトをテストします。
object ExampleControllerSpec extends Specification {
class TestController() extends Controller with ExampleController
"Example Page#index" should {
"should be valid" in {
val controller = new TestController()
val result = controller.index()
result must not beNull
}
}
}
}
このアプローチは、モックをセットアップしてトレイトに差し込むために選択した DI フレームワーク (Subcut/Spring/Guice/Cake Pattern) によって拡張することができます。
次ページ: 機能テスト