我有以下Play(Scala)代码:
object Experiment extends Controller {
//routes file directs /genki here
def genki(name: String) = Action(pipeline(name))
def pipeline(name: String) = {
req:play.api.mvc.RequestHeader => {
val template = views.html.genki(name)
Experiment.Status(200).apply(template).as("text/html")
}
}
def simple = Action {
SimpleResult(
header = ResponseHeader(200, Map(CONTENT_TYPE -> "text/plain")),
body = Enumerator("Hello World!".getBytes())
)
}
}
此编译正常并按预期工作。
使用scala REPL如何显示实际的html?
我有:
scala> val action = simple
action: play.api.mvc.Action[play.api.mvc.AnyContent] = Action(parser=BodyParser(anyContent))
我认为现在REPL中的值引用'action'是一个Action对象,它是AnyContent的类型约束(这是正确的说法吗?)。
我现在如何使用此Action打印出Http Response html内容?
非常感谢
答案 0 :(得分:6)
您可以使用play.api.test.Helpers
:
import play.api.test.Helpers._
val result: Future[SimpleResult] = …
val bodyAsBytes: Array[Byte] = contentAsBytes(result)
还有contentAsString
等。
答案 1 :(得分:6)
在answer by Huw的基础上,这是完整的工作代码:
import play.api.test._
def getStringFromAction(action:Action[AnyContent]):String = {
val request = new FakeRequest("fakeMethod", "fakeUrl", new FakeHeaders, "fakeBody")
val result = action.apply(request).run
import scala.concurrent.duration._
Helpers.contentAsString(result)(1000 millis)
}
您需要包含以下库(默认情况下不包含在Play中):play-test_2.11.jar
,selenium-java.jar
,selenium-api.jar
,selenium-chrome-driver.jar
,selenium-firefox-driver.jar
, selenium-remote-driver.jar
,selenium-htmlunit-driver.jar
,fluentlenium-core.jar
,htmlunit-core-js.jar
和htmlunit.jar
。这些可在Play或Activator发行版中找到。您还可以将build.sbt中的依赖项添加为explained here。
答案 2 :(得分:2)
Action
没有内容,因为它是一个可用于应用Request
并获得结果的对象。
val request: Request[A] = ... // create a request instance
val resultFuture: Future[SimpleResult] = simple(request)
val bodyAsBytes: Array[Byte] = Await.result(Await.result(resultFuture, timeout.duration).body |>>> Iteratee.consume[Array[Byte]](), timeout.duration)
请注意,对于您的示例,空的请求就足够了,因为您不能使用它。
此外,请注意body
中的SimpleResult
是Enumerator
,您需要Iteratee
来申请Await.result
,此处我只是将消费者应用于得到整个清单。使用了2 Future[SimpleResult]
:
Enumerator
完成Iteratee
完成向{{1}}发送数据。