Как создать фиктивный akka Httpresponse с задержкой?

#scala #unit-testing #routes #akka-http

#scala #модульное тестирование #маршруты #akka-http

Вопрос:

Как мы можем создать фиктивный httpresponse с HttpResponse

Но это не создает никакой задержки в ответе, есть ли способ добавить в него задержку?

Комментарии:

1. Почему бы не добавить a Thread.sleep(delay in ms) перед отправкой ответа?

Ответ №1:

Maby что-то вроде этого? На основе akka.шаблон.после. Тест с задержкой 10 секунд -> http://localhost:9000/example ?задержка = 10000

 object Main extends App with Directives {

  implicit val system: ActorSystem = ActorSystem()

  val routes: Route = {
    (get amp; path("example")) {
      parameter("delay".as[Int]) { delay =>
        complete {
          akka.pattern.after(delay.millis) {
            Future.successful(response(delay))
          }
        }
      }
    }
  }

  def response(delay: Int): HttpResponse = {
    HttpResponse(
      StatusCodes.OK,
      entity = HttpEntity(
    ContentTypes.`text/html(UTF-8)`,
    s"""
       |<html>
       | <body>
       |  Example request with delay $delay
       | </body>
       |</html>
       |""".stripMargin
      )
    )
  }

  val (host, port) = ("localhost", 9000)

  Http().newServerAt(host, port).bind(routes)
}
 

Ответ №2:

Да, можно и без Thread.sleep. Потому что это блокирует поток, и если вам нужно имитировать службу, которая находится под большим количеством запросов, это не очень хороший вариант. Проверьте эту старую реализацию, может быть, это может помочь: https://github.com/EmiCareOfCell44/http-retarder

Комментарии:

1. но вы используете akka.pattern.ask здесь ( github.com/EmiCareOfCell44/http-retarder/blob/master/src/main /… ) и afaik это блокирует. Таким образом, это то же самое, что иметь простое HttpResponse , внутри которого есть длинные вычисления. Не так ли?

2. шаблон запроса создает будущее, ожидающее ответа, но он не блокирует весь поток. Нитки. Спящий режим блокирует весь поток, в котором выполняются другие фьючерсы и действующие лица

3. Я знаю, поэтому вам просто нужно обернуть HttpResponse внутри a Future и выполнить там долгое вычисление. Но GET or POST из a HttpResponse все еще блокируется. Другими словами, для этого нет необходимости использовать akka.pattern.ask .

4. Да, вы содержите этот запрос внутри future и с таймаутом