contentAsString
имеет NoMaterializer
в качестве аргумента по умолчанию
def contentAsString(of: Future[Result])(implicit timeout: Timeout, mat: Materializer = NoMaterializer): String
NoMaterializer
просто выбрасывает UnsupportedOperationException
для всего, поэтому попробуйте предоставить ваш собственный
implicit val actorSystem = ActorSystem("test")
implicit val materializer = ActorMaterializer()
play- scala -streaming-example демонстрирует, как можно написать тест для контроллера потоковой передачи.
Обращаясь к комментарию, рассмотрим следующие два маршрута, которые иллюстрируют разницу между строгим и нестрогим (чанкованным, потоковым) телом
def nonStrictBody = Action {
val source = Source.apply(List("woo", "h", "oo"))
Ok.chunked(source)
}
def strictBody = Action {
Ok("woohoo")
}
При вызове contentAsString
на строгом теле , то материализатор не будет использоваться, следовательно, NoMaterializer
является достаточным
В 99% случаев при выполнении тестов с телом результата на самом деле вам не требуется материализатор, поскольку это строгий корпус. Таким образом, вместо того, чтобы всегда требовать неявного материализатора, мы используем его, если он есть, в противном случае у нас есть стандартный, который просто генерирует исключение, если используется.
Однако при вызове contentAsString
для Тело chunked или с потоковым , как это имеет место в маршруте nonStrictBody
, тогда мы должны предоставить правильное Materializer
.