// Don't do this
class MyControllerSpec extends Specification {
"My controller" should {
"return a 404 on top-level GET to non-existent resource" in {
running(FakeApplication()) {
val home = route(FakeRequest(GET, "/mycontroller/blurg")).get
status(home) must equalTo(NOT_FOUND)
}
}
"serve up JSON on list request" in {
running(FakeApplication()) {
val home = route(FakeRequest(GET, "/mycontroller/list")).get
status(home) must equalTo(OK)
contentType(home) must beSome.which(_ == "application/json")
}
}
}
}
Trust me when I say that it is not a good idea. At the very least slow tests, inconsistent test results and general Weird Things™ will happen.
What you most-likely want is something like this:
import play.api._
import play.api.test._
import org.specs2.specification._
import org.specs2.mutable._
/**
* Mix this in to your Specification to spin up exactly one Play FakeApplication
* that will be shut down after the last example has been run.
* Override 'theApp' to use a customised FakeApplication
*/
trait FakePlayApplication {
this: Specification =>
def theApp = FakeApplication()
def startApp = {
System.err.println(s"Starting $theApp")
Play.start(theApp)
}
def stopApp = {
System.err.println(s"Stopping $theApp")
Play.stop()
}
override def map(fs: => Fragments) = Step(startApp) ^ fs ^ Step(stopApp)
}
Which you could use in my previous example as follows:
class MyControllerSpec extends Specification with FakePlayApplication {
"My controller" should {
"return a 404 on top-level GET to non-existent resource" in {
val home = route(FakeRequest(GET, "/mycontroller/blurg")).get
status(home) must equalTo(NOT_FOUND)
}
"serve up JSON on list request" in {
val home = route(FakeRequest(GET, "/mycontroller/list")).get
status(home) must equalTo(OK)
contentType(home) must beSome.which(_ == "application/json")
}
}
}
Less repetition, faster execution, and most importantly, RELIABLE TESTS!