Как указать неявное значение для akka.stream.Materializer при отправке FakeRequest?

Я пытаюсь разобраться в ошибках, которые вижу ниже, и узнать, как их исправить.

could not find implicit value for parameter materializer: akka.Stream.Materializer
  val fut: Future[Result] = action.apply(fakeRequest).run
                                  ^
not enough arguments for method run (implicit materializer: akka.stream.Materializer)scala.concurrent.Future[play.api.mvc.Result].
Unspecified value parameter materializer.
  val fut: Future[Result] = action.apply(fakeRequest).run
                                  ^

Вот тестовый код, вызвавший ошибку (и):

package com.foo.test

import com.foo.{Api, BoundingBox}
import org.scalatest.{FlatSpec, Matchers}
import play.api.libs.json._
import play.api.mvc._
import play.api.test.{FakeHeaders, FakeRequest}

import scala.concurrent.duration._
import scala.concurrent.{Await, Future}

class TestJmlPlay extends FlatSpec with Matchers {

  val bbox = new BoundingBox(-76.778154438007732F, 39.239828198015971F, -76.501003519894326F, 39.354663763993926F)

  "latitudes" should "be between swLat and neLat" in {
    val action: Action[AnyContent] = (new Api).getForPlay(bbox)
    val jsonStr = getStringFromAction(action)
    areLatitudesOk(jsonStr, bbox) shouldBe true
  }

  private def getStringFromAction(action:Action[AnyContent]):String = {
    val fakeRequest: Request[String] = new FakeRequest("fakeMethod", "fakeUrl", new FakeHeaders, "fakeBody")
    val fut: Future[Result] = action.apply(fakeRequest).run  // <== ERROR!
    val result = Await.result(fut, 5000 milliseconds)
    result.body.toString
  }

  private def areLatitudesOk(jsonStr: String, bbox: BoundingBox): Boolean = ...

}

person gknauth    schedule 29.04.2016    source источник
comment
Попробуйте это: implicit val materializer = ActorMaterializer()   -  person Mariusz Beltowski    schedule 29.04.2016
comment
Спасибо @Mario. Однако я не уверен, где поставить эту строчку.   -  person gknauth    schedule 29.04.2016


Ответы (2)


Вы можете создать неявный ActorMaterializer в своем тестовом классе, который будет использовать ActorSystem testkit:

import akka.testkit.TestKit
import akka.actor.ActorSystem

class TestJmlPlay(_system : ActorSystem) extends TestKit(_system) ... {

  implicit val materializer: ActorMaterializer = ActorMaterializer()

  val bbox = ...
person Ramón J Romero y Vigil    schedule 02.05.2016

Вам не нужен Materializer.

Я считаю, что вы вызываете неправильный action.apply метод.
Вы хотите def apply(request: Request[A]): Future[Result]
Чтобы вызвать правильный, вам нужен FakeRequest[AnyContent], тот же параметризованный тип, что и action:Action[AnyContent]. Этот тип принудительно используется PlayBodyParser, я полагаю, вы настроили для своего действия.

После этого звонить .run не нужно

person Bartosz Piorunski    schedule 23.01.2018