FakeApplication

Play经常需要一个运行的Application作为上下文:其通常由Play.api.Play.current提供。

为了针对测试提供一个环境。Play提供了一个FakeApplication雷其可以和一个不同的全局对象,其他配置甚至其他插件一起被配置。

  1. override def onStart(app: Application) { println("Hello world!") }
  2. }))

WithApplication

为了传递一个应用到一个例子,请使用WithApplication.一个显式的
FakeApplication可以被传递进去,但是默认的FakeApplication为了方便使用而被提供。
因为WithAppication是一个嵌入的Around块,你可以重写它来提供你自己的数据全域:

  1. abstract class WithDbData extends WithApplication {
  2. override def around[T: AsResult](t: => T): Result = super.around {
  3. setupData()
  4. t
  5. }
  6. def setupData() {
  7. // 配置数据
  8. }
  9. }
  10. "Computer model" should {
  11. "be retrieved by id" in new WithDbData {
  12. // 你的测试代码
  13. }
  14. "be retrieved by email" in new WithDbData {
  15. // 你的测试代码
  16. }

port值包含了服务器上运行的这个端口号。其默认的是19001,甚至你可以通过传递这个端口到WinthServer中或设置系统属性testserver.port来改变它。这个在与持续集成服务器结合的时候非常有用,所以这个端口可以为每个构建而动态保留。
一个FakeApplication也可以被传递到测试服务器,当设定定制的路由和测试WS调用时会非常有用:

  1. val appWithRoutes = FakeApplication(withRoutes = {
  2. case ("GET", "/") =>
  3. Action {
  4. Ok("ok")
  5. }
  6. })
  7. "test WS logic" in new WithServer(app = appWithRoutes, port = 3333) {
  8. await(WS.url("http://localhost:3333").get()).status must equalTo(OK)
  9. }

WithBrowser

如果你想使用一个浏览器来测试你的应用,你可以使用Selenium WebDriver.Play将为你启用该WebDriver,并使用FluentLenium提供的简洁的API来包裹它。如同WithServer一样使用WithBrowser,你可以更改端口,FakeApplication;而且你可以通过选择网页浏览器而使用:

  1. val fakeApplicationWithBrowser = FakeApplication(withRoutes = {
  2. case ("GET", "/") =>
  3. Action {
  4. Ok(
  5. """
  6. |<html>
  7. |<body>
  8. | <div id="title">Hello Guest</div>
  9. | <a href="/login">click me</a>
  10. |</body>
  11. |</html>
  12. """.stripMargin) as "text/html"
  13. }
  14. case ("GET", "/login") =>
  15. Action {
  16. Ok(
  17. """
  18. |<html>
  19. |<body>
  20. | <div id="title">Hello Coco</div>
  21. |</body>
  22. """.stripMargin) as "text/html"
  23. }
  24. })
  25. "run in a browser" in new WithBrowser(webDriver = WebDriverFactory(HTMLUNIT), app = fakeApplicationWithBrowser) {
  26. browser.goTo("/")
  27. // 检查页面
  28. browser.$("#title").getTexts().get(0) must equalTo("Hello Guest")
  29. browser.$("a").click()
  30. browser.url must equalTo("/login")
  31. browser.$("#title").getTexts().get(0) must equalTo("Hello Coco")
  32. }

PlaySpecification

PlaySpecification是specification的一个扩展它不包含被默认的specs2规范所提供而与Play 帮助器方法相冲突的一些混合对象。为了便利它也混合进Play测试帮助器和类型。

  1. "render index template" in new WithApplication {
  2. val html = views.html.index("Coco")
  3. contentAsString(html) must contain("Hello Coco")
  4. }

测试一个控制器

你可以调用任何被一个FakeRequest所提供的任何Action:

  1. "respond to the index Action" in {
  2. val result = controllers.Application.index()(FakeRequest())
  3. status(result) must equalTo(OK)
  4. contentType(result) must beSome("text/plain")
  5. contentAsString(result) must contain("Hello Bob")
  6. }

技术上讲,你这里不需要WithApplication,尽管使用它并不会带来不利影响。

测试路由器

取代自己调用Action,你可以让Router来做:

  1. val Some(macintosh) = Computer.findById(21)
  2. macintosh.name must equalTo("Macintosh")
  3. macintosh.introduced must beSome.which(_ must beEqualTo("1984-01-24"))