Акка Http Test Gzip Ответ - PullRequest
0 голосов
/ 23 октября 2018

Итак, у меня есть набор маршрутов Akka Http, написанных на scala.Вот как это выглядит

val route: Route = {
  handleRejections(PrimaryRejectionHandler.handler) {
    handleExceptions(PrimaryExceptionHandler.handler) {
      cors() {
        encodeResponseWith(Gzip) {
          pathPrefix("v1") {
            new v1Routes().handler
          } ~
            path("ping") {
              complete("pong")
            }
        }
      }
    }
  }
}

Теперь я хочу проверить это с помощью scala-test и akka testkit.

class HttpRouteTest extends WordSpec with Matchers with ScalatestRouteTest {

  "GET /ping" should {

    "return 200 pong" in new Context {
      Get("/ping") ~> httpRoute ~> check {
        responseAs[String] shouldBe "pong"
        status.intValue() shouldBe 200
      }
    }
  }

  trait Context {
    val httpRoute: Route = new HttpRoute().route
  }

}

Теперь, поскольку я кодирую свои ответы с помощью gzip в маршруте,тест становится бессмысленным, когда он пытается преобразовать в строку.В результате тест не проходит.

Есть ли какое-то решение для этого?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Для тех, кто сталкивается с этим.

Вот так я решил проблему.Сначала я структурировал пакеты модульных тестов с тем же именем модуля, который он тестирует.

Я создал BaseService, который будет использоваться во всех тестах, который выглядит следующим образом

trait BaseServiceTest extends WordSpec with Matchers with ScalatestRouteTest with MockitoSugar {

  def awaitForResult[T](futureResult: Future[T]): T =
    Await.result(futureResult, 5.seconds)

  def decodeResponse(response: HttpResponse): HttpResponse = {
    val decoder = response.encoding match {
      case HttpEncodings.gzip ⇒
        Gzip
      case HttpEncodings.deflate ⇒
        Deflate
      case HttpEncodings.identity ⇒
        NoCoding
    }

    decoder.decodeMessage(response)
  }
}

Затем с помощьюэто я написал свои тесты примерно так

class UserTest extends BaseServiceTest {

  "GET /user" should {

    "return user details with 200 code" in new Context {

      Get("/") ~> userRoute ~> check {
        val decodedResponse = getBody(decodeResponse(response))

        decodedResponse.user.name.isDefined shouldBe true
        decodedResponse.user.age.isDefined shouldBe true
        decodedResponse.user.city.isDefined shouldBe true
        status.intValue() shouldBe 200
      }
    }
  }

  trait Context {
    val userRoute: Route = UserRoute.route
  }

  def getBody(resp: HttpResponse): UserResponse = {

    import UserResponseJsonProtocol._ // Using spray-json for marshalling protocols

    Await.result(Unmarshal(resp).to[UserResponse], 10.seconds)
  }
}

Надеюсь, это поможет.Спасибо!

0 голосов
/ 23 октября 2018

В настоящее время akka-http не обеспечивает автоматическое декодирование ответов на стороне клиента, и то же самое, по-видимому, справедливо для testkit.

Это означает, что если вам нужно добавить обработку декомпрессии самостоятельно.Тем не менее, большая часть фактического кода декодирования уже встроена в akka, и вам нужен только некоторый клейкий код, как описано в [ Документация Akka HTTP ].

...