#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
внутри aFuture
и выполнить там долгое вычисление. НоGET
orPOST
из aHttpResponse
все еще блокируется. Другими словами, для этого нет необходимости использоватьakka.pattern.ask
.4. Да, вы содержите этот запрос внутри future и с таймаутом