FakeApplication
Play经常需要一个运行的Application作为上下文:其通常由Play.api.Play.current提供。
为了针对测试提供一个环境。Play提供了一个FakeApplication雷其可以和一个不同的全局对象,其他配置甚至其他插件一起被配置。
override def onStart(app: Application) { println("Hello world!") }
}))
WithApplication
为了传递一个应用到一个例子,请使用WithApplication.一个显式的
FakeApplication可以被传递进去,但是默认的FakeApplication为了方便使用而被提供。
因为WithAppication是一个嵌入的Around块,你可以重写它来提供你自己的数据全域:
abstract class WithDbData extends WithApplication {
override def around[T: AsResult](t: => T): Result = super.around {
setupData()
t
}
def setupData() {
// 配置数据
}
}
"Computer model" should {
"be retrieved by id" in new WithDbData {
// 你的测试代码
}
"be retrieved by email" in new WithDbData {
// 你的测试代码
}
port值包含了服务器上运行的这个端口号。其默认的是19001,甚至你可以通过传递这个端口到WinthServer中或设置系统属性testserver.port来改变它。这个在与持续集成服务器结合的时候非常有用,所以这个端口可以为每个构建而动态保留。
一个FakeApplication也可以被传递到测试服务器,当设定定制的路由和测试WS调用时会非常有用:
val appWithRoutes = FakeApplication(withRoutes = {
case ("GET", "/") =>
Action {
Ok("ok")
}
})
"test WS logic" in new WithServer(app = appWithRoutes, port = 3333) {
await(WS.url("http://localhost:3333").get()).status must equalTo(OK)
}
WithBrowser
如果你想使用一个浏览器来测试你的应用,你可以使用.Play将为你启用该WebDriver,并使用FluentLenium提供的简洁的API来包裹它。如同WithServer一样使用WithBrowser,你可以更改端口,FakeApplication;而且你可以通过选择网页浏览器而使用:
val fakeApplicationWithBrowser = FakeApplication(withRoutes = {
case ("GET", "/") =>
Action {
Ok(
"""
|<html>
|<body>
| <div id="title">Hello Guest</div>
| <a href="/login">click me</a>
|</body>
|</html>
""".stripMargin) as "text/html"
}
case ("GET", "/login") =>
Action {
Ok(
"""
|<html>
|<body>
| <div id="title">Hello Coco</div>
|</body>
""".stripMargin) as "text/html"
}
})
"run in a browser" in new WithBrowser(webDriver = WebDriverFactory(HTMLUNIT), app = fakeApplicationWithBrowser) {
browser.goTo("/")
// 检查页面
browser.$("#title").getTexts().get(0) must equalTo("Hello Guest")
browser.$("a").click()
browser.url must equalTo("/login")
browser.$("#title").getTexts().get(0) must equalTo("Hello Coco")
}
PlaySpecification
PlaySpecification是specification的一个扩展它不包含被默认的specs2规范所提供而与Play 帮助器方法相冲突的一些混合对象。为了便利它也混合进Play测试帮助器和类型。
"render index template" in new WithApplication {
val html = views.html.index("Coco")
contentAsString(html) must contain("Hello Coco")
}
测试一个控制器
你可以调用任何被一个FakeRequest所提供的任何Action:
"respond to the index Action" in {
val result = controllers.Application.index()(FakeRequest())
status(result) must equalTo(OK)
contentType(result) must beSome("text/plain")
contentAsString(result) must contain("Hello Bob")
}
技术上讲,你这里不需要WithApplication,尽管使用它并不会带来不利影响。
测试路由器
取代自己调用Action,你可以让Router来做:
val Some(macintosh) = Computer.findById(21)
macintosh.name must equalTo("Macintosh")
macintosh.introduced must beSome.which(_ must beEqualTo("1984-01-24"))