【问题标题】:Unit testing securesocial authentication for play2.3.x controllers in scalascala 中 play2.3.​​x 控制器的安全社交身份验证单元测试
【发布时间】:2014-08-26 21:23:49
【问题描述】:

我们在 Play 2.3.x 应用程序中使用 securesocial 模块进行身份验证。

我想对我的应用程序中需要安全社交身份验证的控制器进行单元测试。测试套件不适用于最新版本。

任何人都可以为我提供一个解决方案,使用安全社交身份验证向控制器中的所有方法发送虚假的身份验证请求吗?

下面给出的是我们应用程序控制器中的一种方法:

def list = SecuredAction.async { implicit request =>
  val params = request.asInstanceOf[RequestHeader]

  val future = DeviceDAO.listAll(params)
  future.map(list => {
    Ok(ResponseBuilder.getResponseJson(params, Json.toJson(list.devices), list.totalItems))
  })
} 

目前我们正在通过在我们的请求标头中附加 authtoken 来对我们的控制器进行单元测试,如下所示:

 "list is empty " in new WithApplication {
    val req = FakeRequest(GET ,"/v1/devices").withHeaders(
      "X-Auth-Token" -> authToken,
      "Content-Type" -> authcontentType
    )
    val home =  route(req).get
    status(home) must equalTo(OK)
    var items = contentAsJson(home) \ "items"
    items.as[JsArray].value.length must equalTo(0)
  }

由于这不是测试身份验证的理想方法,我们希望使用对控制器的正确假身份验证请求进行测试。旧版本的安全社交提供了一个测试套件,可用作:

"Access secured index " in new WithLoggedUser(minimalApp) {
val req: Request[AnyContent] = FakeRequest().
  withHeaders((HeaderNames.CONTENT_TYPE, "application/x-www-form-urlencoded")).
  withCookies(cookie) // Fake cookie from the WithloggedUser trait

val result = Application.index.apply(req)

val actual: Int= status(result)
actual must be equalTo OK

}

但这不适用于 Play 2.3.x 应用程序。 那么有人可以告诉我如何以上述方式为Play 2.3.x applcaition编写最新版本的securesocial身份验证的单元测试用例

【问题讨论】:

    标签: playframework-2.3 securesocial


    【解决方案1】:

    我们已经在使用 play 2.3 和 SecureSocial 对其进行单元测试。您可以在下面找到我们的登录实用程序类和我们用于通过 POST 请求执行身份验证的 WithAppLogin 抽象。

    希望对你有帮助。

    package controllers.common
    
    import org.specs2.execute.AsResult
    import org.specs2.execute.Result
    
    import play.api.test.{FakeRequest, WithApplication, Writeables, RouteInvokers}
    import play.api.mvc.Cookie
    import play.api.test.Helpers
    import play.api.test.Helpers.cookies
    import play.api.test.Helpers.defaultAwaitTimeout
    
    
    object LoginUtil extends RouteInvokers with Writeables {
    
      val loginRequest = FakeRequest(Helpers.POST, "/auth/authenticate/userpass")
                           .withFormUrlEncodedBody(("username", "test@example.com"), ("password", "MyTestPassword"))
      var _cookie: Cookie = _
    
      def cookie = _cookie
    
      def login() {
        val credentials = cookies(route(loginRequest).get)
        val idCookie = credentials.get("id")
        _cookie = idCookie.get
      }
    }
    
    abstract class WithAppLogin extends WithApplication {
      override def around[T: AsResult](t: => T): Result = super.around {
        LoginUtil.login()
        t
      }
    }
    

    测试示例

    package controllers.admin
    
    import org.specs2.mutable.Specification
    import org.specs2.mutable._
    import play.api.test.WithApplication
    import play.api.test._
    import play.api.test.Helpers._
    import play.api.mvc._
    import securesocial.core._
    import play.Play
    import controllers.common._
    import play.api.test.Helpers.defaultAwaitTimeout
    
    class AdminDashboardTest extends Specification {
    
      "Dashboard" should {
    
        "should be accessible" in new WithAppLogin {
          //setup
          val request = FakeRequest().withCookies(LoginUtil.cookie)
    
          //exercise
          val result = controllers.admin.index()(request)
    
          //verify
          status(result) must equalTo(OK)
          contentAsString(result) must contain("Welcome to the dashboard!")
        }
    
      }
    
    }
    

    【讨论】:

    • 感谢您提供代码 sn-p .. 但是当我使用上述代码时,我的应用程序抛出了一些内部错误。您可以为使用上述 util 类的方法发布一个示例测试用例吗
    • @bhavya :用一个例子更新了我的帖子。请注意,其中有一些自定义代码,例如controllers.admin.index()。这是给定 SecureSocial 的“SecuredAction”。
    • 嘿,非常感谢,那是因为一些数据库错误,代码运行良好.. 非常感谢 :)
    猜你喜欢
    • 2020-05-23
    • 2015-06-24
    • 2016-04-03
    • 2018-02-14
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多