Spray-Test декодирование gzip

Я пытаюсь написать тест для спрея

class FullTestKitExampleSpec extends Specification with Specs2RouteTest with UserController with HttpService {
  def actorRefFactory = system

  "The service" should {

    "return a greeting for GET requests to the root path" in {
      Get("/user") ~> `Accept-Encoding`(gzip) ~> userRoute ~> check {
        val responsex = response
        responseAs[String] must contain("Test1")
      }
    }
  }
}

у меня есть следящий маршрутизатор

trait UserController extends HttpService with Json4sSupport with CORSSupport{
  override implicit def json4sFormats: Formats = DefaultFormats

  val userRoute = {
    cors {
      compressResponse(Gzip) {
        path("user") {
          get {
            complete {
              "Test1"
            }
          } ~
            post {
              entity(as[UserRegister]) { person =>
                complete {
                  println(person.name)
                  person.name
                }
              }
            }
        }
      }
    }
  }
}

Я использую сжатие GZIP для ответа, но

Не удалось распаковать ответ на тип 'java.lang.String' для утверждения responseAs: MalformedContent (неизвестный токен рядом: , Some (org.json4s.ParserUtil$ParseException: неизвестный токен рядом:))

Как установить автодекодирование GZIP HttpResponse в строку?


person Rinat Mukhamedgaliev    schedule 06.01.2015    source источник


Ответы (1)


Включите decode(Gzip) в свой конвейер:

import spray.httpx.encoding.Gzip
import spray.httpx.ResponseTransformation

class MySprayRouteSpec extends FlatSpec
    with ShouldMatchers
    with ResponseTransformation
    with ScalatestRouteTest
    {
        Get("/") ~> mapHttpResponse(decode(Gzip))(userRoute) ~> check{
              response.status should equal(OK)
        }
    }
person lmm    schedule 06.01.2015
comment
Ошибка: (18, 65) не найдено: значение decode Get(/user) ~› Accept-Encoding(identity) ~› userRoute ~› decode(Gzip) ~› check { - person Rinat Mukhamedgaliev; 06.01.2015
comment
Смешайте ResponseTransformation, т.е. class FullTestKitExampleSpec extends ResponseTransformation with ... - person lmm; 06.01.2015
comment
Ошибка:(19, 71) несоответствие типов; найдено: FullTestKitExampleSpec.this.ResponseTransformer (который расширяется до) spray.http.HttpResponse => spray.http.HttpResponse требуется: - person Rinat Mukhamedgaliev; 06.01.2015
comment
Get(/user) ~› userRoute ~› decode(Gzip) ~› check { - person Rinat Mukhamedgaliev; 06.01.2015
comment
Я тоже не знаю, что для этого нужно... Теперь я не пойму, как работать с пайплайнами. - person Rinat Mukhamedgaliev; 06.01.2015
comment
Нет, я имею в виду, что требуется в сообщении об ошибке? Вы отрезали это как раз перед важной частью - person lmm; 06.01.2015
comment
decode(Gzip) — это HttpResponse => HttpResponse, тогда как функция тильды преобразует объект RouteResult. Не уверен, что это хороший способ написать это, но я обнаружил, что могу заставить его работать, заменив маршрут на mapHttpResponse(decode(Gzip))(userRoute) из spray.routing.BasicDirectives. - person William Carter; 23.02.2015
comment
Спасибо, Владимир, ваш комментарий помог мне. Также спрашиваю себя, есть ли более приятное решение - person longliveenduro; 23.02.2015