gpt4 book ai didi

scala - 如何从 Play 2.0 测试 Zentasks 示例应用程序

转载 作者:行者123 更新时间:2023-11-28 19:49:48 24 4
gpt4 key购买 nike

我玩 Play 2.0,Scala 版本。目前,我分析 Zentasks sample app .

此应用程序的一部分是身份验证机制,主要包含在 Secured 特性中。我想知道如何测试安全操作,例如。 索引 来自 Projects controller .

对于不安全的操作,我可能会做类似的事情

val result = controllers.Projects.index(FakeRequest())

运行一个 Action 并得到它的结果。

安全操作怎么办?

免责声明:我对 Scala 和 Play 都是全新的,所以所有提示都非常有值(value)。谢谢!

最佳答案

有一个fix for the integrated approach to this在 Playframewrk v2.1 中我有一个 backport of the fix on the 2.0.x branch

在它被合并和发布之前,这是我所做的(它适用于 Play 2.0.3+):

我像这样在 libs 包中定义了自己的 Helpers 对象。

package libs

import play.api.mvc._

import play.api.libs.iteratee._
import play.api.libs.concurrent._
import play.api.test._

object Helpers {

def routeAndCall[T](request: FakeRequest[T]): Option[Result] = {
routeAndCall(this.getClass.getClassLoader.loadClass("Routes").asInstanceOf[Class[play.core.Router.Routes]], request)
}
/**
* Use the Router to determine the Action to call for this request and executes it.
*/
def routeAndCall[T, ROUTER <: play.core.Router.Routes](router: Class[ROUTER], request: FakeRequest[T]): Option[play.api.mvc.Result] = {
val routes = router.getClassLoader.loadClass(router.getName + "$").getDeclaredField("MODULE$").get(null).asInstanceOf[play.core.Router.Routes]
routes.routes.lift(request).map {
case a: Action[_] =>
val action = a.asInstanceOf[Action[T]]
val parsedBody: Option[Either[play.api.mvc.Result, T]] = action.parser(request).fold(
(a, in) => Promise.pure(Some(a)),
k => Promise.pure(None),
(msg, in) => Promise.pure(None)
).await.get

parsedBody.map{resultOrT =>
resultOrT.right.toOption.map{innerBody =>
action(FakeRequest(request.method, request.uri, request.headers, innerBody))
}.getOrElse(resultOrT.left.get)
}.getOrElse(action(request))
}
}

}

然后在我的测试中,我导入了我的 Helpers 和整个 play Helpers 上下文,除了 routeAndCall :

import libs.Helpers._
import play.api.test.Helpers.{routeAndCall => _,_}

然后我使用 Around 来设置我的应用程序(我需要提供一个 application.secret,因为我将经过身份验证的用户名存储在基于签名 cookie 的 session 中)

def appWithSecret():Map[String,String]={
Map(("application.secret","the answer is 42 !"))
}


object emptyApp extends Around {
def around[T <% Result](t: => T) = {
running(FakeApplication(additionalConfiguration = inMemoryMongoDatabase("emptyApp")++appWithSecret())) {
User(new ObjectId, "Jane Doe", "foobar@example.com", "id1").save()
t // execute t inside a http session
}
}
}

这让我可以编写以下测试:

"respond to the index Action" in emptyApp {
val request: FakeRequest[AnyContent] = FakeRequest(GET, "/expenses").withSession(("email", "foobar@example.com"))
val Some(result) = routeAndCall(request)

status(result) must equalTo(OK)
contentType(result) must beSome("application/json")
charset(result) must beSome("utf-8")
contentAsString(result) must contain("Hello Bob")
}

即使它不是单元测试,它也允许您运行安全代码。

关于scala - 如何从 Play 2.0 测试 Zentasks 示例应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9964808/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com