Play 2.0 中文资料 - 编写功能性测试
测试模板
因为模板自身就是一个标准的 Scala 函数, 所以你可以在你的测试代码中直接执行它, 并检查结果:
1"render index template" in {
2 val html = views.html.index("Coco")
3
4 contentType(html) must equalTo("text/html")
5 contentAsString(html) must contain("Hello Coco")
6}测试你的 controllers
你可以通过提供一个
FakeRequest 来调用任何 Action 代码:1"respond to the index Action" in {
2 val result = controllers.Application.index("Bob")(FakeRequest())
3
4 status(result) must equalTo(OK)
5 contentType(result) must beSome("text/html")
6 charset(result) must beSome("utf-8")
7 contentAsString(result) must contain("Hello Bob")
8}测试 router
代之以调用
Action 本身, 你可以让 Router 来为你效劳:1"respond to the index Action" in {
2 val Some(result) = routeAndCall(FakeRequest(GET, "/Bob"))
3
4 status(result) must equalTo(OK)
5 contentType(result) must beSome("text/html")
6 charset(result) must beSome("utf-8")
7 contentAsString(result) must contain("Hello Bob")
8}Unmi 注: 上面两种测试方法可以说是基于两种路径达到对 Controller 的测试。一个是直接调用,另一个是基于 URL,它们所断言的内容是一致的,都验证了 Controller 是否能正常的工作,对 Router 的测试还兼顾了对 URL 的验证。因此,从我个人的观点来说,如果针对 Router 写的测试,一贯而穿,可以不用再专门的测试 Controller 了。
启动一个真实的 HTTP 服务器
有时候你需通过你的测试对实际的 HTTP 栈进行测试, 这种情况下你可以启动一个测试服务器:
1"run in a server" in {
2 running(TestServer(3333)) {
3
4 await(WS.url("http://localhost:3333").get).status must equalTo(OK)
5
6 }
7}从 Web 浏览器中来测试
假如你想要用浏览器来测试你的应用, 你可以采用 Selenium WebDriver. Play 会为你启动 WebDriver, 并且由 FluentLenium 封装,提供了很方便的 API。
1"run in a browser" in {
2 running(TestServer(3333), HTMLUNIT) { browser =>
3
4 browser.goTo("http://localhost:3333")
5 browser.$("#title").getTexts().get(0) must equalTo("Hello Guest")
6
7 browser.$("a").click()
8
9 browser.url must equalTo("http://localhost:3333/Coco")
10 browser.$("#title").getTexts().get(0) must equalTo("Hello Coco")
11
12 }
13}[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。