使用WS和ScalaTest

时间:2015-10-06 12:58:31

标签: scala testing cookies scalatest playframework-2.4

我有一个使用表单登录的Web应用程序,这会向用户返回一个会话cookie,用于授权对应用程序其余部分的请求。我无法根据我的要求发送此Cookie值。我的测试工具如下:

val loginResponse = await(WS.url(s"http://localhost:$port/authenticate")
  .withHeaders("Content-Type" -> "application/x-www-form-urlencoded")
  .post(Map("email" -> Seq("admin@example.com"), "password" -> Seq("genivirocks!"))))
loginResponse.status mustBe (OK)
val cookies = loginResponse.cookies(0).toString
val vehiclesResponse = await(WS.url(s"http://localhost:$port/api/v1/vehicles/" + testVin)
  .withHeaders("Cookie" -> cookies)
  .put(""))
vehiclesResponse.status mustBe (OK)
val vehiclesFilterResponse = await(WS.url(s"http://localhost:$port/api/v1/vehicles?regex=" + testVin)
  .withHeaders("Cookie" -> cookies)
  .get())
vehiclesFilterResponse.status mustBe (OK)

请求失败,因为第二个请求获得204而不是200,因为它被重定向到登录页面,因为cookie被解释为无效。当第二个请求发出时,Web服务器给出以下错误:

  

2015-10-06 14:56:15,991   [sota-core-service-akka.actor.default-dispatcher-42]警告   akka.actor.ActorSystemImpl - 非法请求标头:非法' cookie'   标题:无效的输入' EOI',预期的tchar,' \ r',WSP或' =' (第1行,   第178栏):   PLAY2AUTH_SESS_ID = ee84a2d5a0a422a3e5446f82f9f3c6f8eda9db1cr〜jz7ei0asg0hk.ebd8j.h4cpjj ~~ 9c0(yxt8p * jqvgf)_t1.5b(7I〜tly21(* ID;   路径= /;期满= 1444139775000; MAXAGE = 3600;中HTTPOnly

我自己尝试构建Cookie字符串并确保没有额外的' \ r'最后的人物等等,没有运气。谷歌似乎也没有任何暗示。有没有更好的方法使用WS发送cookie值?

修改

使用以下代码:

import play.api.mvc.Cookies

val loginResponse = ...
loginResponse.status mustBe (OK)
val cookies = loginResponse.cookies
val cookie = Cookies.decodeCookieHeader(loginResponse.cookies(0).toString)
val vehiclesResponse = await(WS.url(s"http://localhost:$port/api/v1/vehicles/" + testVin)
  .withHeaders("Cookie" -> Cookies.encodeCookieHeader(cookie))
  .put(""))
vehiclesResponse.status mustBe (OK)
...

1 个答案:

答案 0 :(得分:1)

为什么不使用现有的Cookies.encode函数为您执行Cookie编码?

import play.api.mvc.Cookies

val loginResponse = ...
loginResponse.status mustBe (OK)
val cookies = loginResponse.cookies
val vehiclesResponse = await(WS.url(s"http://localhost:$port/api/v1/vehicles/" + testVin)
  .withHeaders("Cookie" -> Cookies.encode(cookies))
  .put(""))
vehiclesResponse.status mustBe (OK)
...