单元测试scala中play2.3.​​x控制器的secansocial身份验证

时间:2014-08-25 12:53:19

标签: playframework-2.3 securesocial

我们在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身份验证的单元测试用例

1 个答案:

答案 0 :(得分: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!")
    }

  }

}