// 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!
No comments:
Post a Comment
Comments welcome - spam is not. Spam will be detected, deleted and the source IP blocked.