我们在Play 2.3中使用securesocial模块进行身份验证。x应用程序。
我想单元测试我的应用程序中需要安全社会认证的控制器。最新版本的testkit不可用。
有没有人可以向我提供一个解决方案,使用安全的社会身份验证向控制器中的所有方法发送虚假的经过身份验证的请求?
下面给出的是我们应用程序控制器中的一个方法:
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)
}
由于这不是测试身份验证的理想方法,我们希望为控制器使用正确的假身份验证请求进行测试。旧版本的secure social提供了一个测试工具包,可以用作:
"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编写最新版本的securesocial认证的单元测试用例吗?x applcaition
我们已经在play 2.3和SecureSocial上进行了单元测试。下面是我们的登录util类和WithAppLogin抽象,我们使用它来执行POST请求的身份验证。
希望能有所帮助。
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!")
}
}
}