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