我们在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身份验证的单元测试用例
答案 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!")
}
}
}