データベースインスタンスを必要とするControllerのユニットテストとE2Eテストを作成する。
Controllerのユニットテスト
Specクラスの前処理
テスト用データベースの定義を記述。
以下はh2のインメモリデータベースをPostgreSQLモードで起動したものをテスト用データベースとして使用した例。
nameは実行したいEvolutionsのディレクトリ名を指定する。多分、自動で初期化されないので、予めcleanupEvolutionsしておけば問題ないはず。
class PeopleControllerSpec extends PlaySpec with GuiceOneAppPerTest with Injecting { import play.api.db.Databases import play.api.db.evolutions._ val database = Databases.inMemory( name = "default", urlOptions = Map( "MODE" -> "PostgreSQL" ), config = Map( "logStatements" -> true ) ) //Evolutionsは /conf/evolutions/"dbname" を実行する Evolutions.cleanupEvolutions(database) Evolutions.applyEvolutions(database)
ユニットテストの記述
あとは、dbインスタンスを注入してテストを記述すればよい。
"PeopleController GET" should { "render the index page from a new instance of controller" in { val controller = new PeopleController(database) val home = controller.index().apply(FakeRequest(GET, "/").withCSRFToken) status(home) mustBe OK contentType(home) mustBe Some("text/html") contentAsString(home) must include ("Terry") } }
SeleniumのE2Eテスト
Specクラスの前処理
fakeApplication()
をオーバーライドして依存関係を変更する。
class PeopleSpec extends PlaySpec with GuiceOneServerPerTest with OneBrowserPerSuite with HtmlUnitFactory{ override def fakeApplication(): Application = { new GuiceApplicationBuilder() .configure( "db.default.driver" -> "org.h2.Driver", "db.default.url" -> "jdbc:h2:mem:test;MODE=PostgreSQL" ) .build() }
E2Eテストの記述
あとは従来通りのテストを記述すればよい。
"GET /" should { "view表示のテスト" in { go to s"http://localhost:$port/" assert(pageTitle === "index view") assert(findAll(className("db-data")).length != 0) } }