首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何测试Play 2.0中的Zentask示例应用程序

如何测试Play 2.0中的Zentask示例应用程序
EN

Stack Overflow用户
提问于 2012-04-01 13:38:01
回答 2查看 868关注 0票数 5

我玩的是play 2.0,Scala版本。目前,我分析Zentasks示例应用程序

该应用程序的一个部分是身份验证机制,主要覆盖在Secured特性中。我想知道我怎么能测试安全的行动,前。index,来自项目控制器

对于不安全的行动,我可能会做一些类似的事情

代码语言:javascript
运行
复制
val result = controllers.Projects.index(FakeRequest())

运行操作并获得其结果。

在有担保的情况下,我该怎么办?

免责声明:我对Scala和Play都很陌生,所以所有的提示都是非常有价值的。谢谢!

EN

回答 2

Stack Overflow用户

发布于 2012-10-23 16:31:22

在Playfrawrkv2.1中有一个修正了对此的集成方法我有一个2.0.x分支上修复程序的后端端口

在它被合并和发布之前,我做了以下工作(它在Play 2.0.3+上工作):

我在libs包中定义了自己的Helpers对象,如下所示。

代码语言:javascript
运行
复制
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))
    }
  }

}

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

代码语言:javascript
运行
复制
import libs.Helpers._
import play.api.test.Helpers.{routeAndCall => _,_}

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

代码语言:javascript
运行
复制
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
      }
    }
  }

这允许我编写以下测试:

代码语言:javascript
运行
复制
"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")
    }

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

票数 2
EN

Stack Overflow用户

发布于 2012-09-02 16:57:38

好吧,我也不是专家,但我有个主意。

创建一个trait InSecure trait extends Secured,它覆盖安全操作并始终允许访问。然后您可以在您的测试中创建一个object InSecureProjects extends Projects with InSecture,这应该只覆盖安全性检查,并允许您在没有任何安全性的情况下测试这些操作。

现在,不是在Projects上运行测试,而是在InSecureProjects上运行它们。您可以对其他安全控制器进行完全相同的操作。

我还没有测试它,所以让我知道它是否有效;)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9964808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档