J'ai une action de contrôleur que je voudrais tester mais je reçois l'erreur ci-dessous. J'ai l'impression qu'il y a quelque chose de petit que je pourrais manquer, mais je n'arrive pas à comprendre ce que c'est. J'ai écrit un petit code pour illustrer le problème. Abit de plus de contexte, je voudrais être en mesure de fournir des dépendances fictives au contrôleur c'est pourquoi je suis en train de reprendre son instanciation.Test de l'unité de jeu actions du contrôleur qui ont des analyseurs json
java.lang.UnsupportedOperationException: NoMaterializer does not provide an ExecutionContext
[info] at play.api.test.NoMaterializer$.executionContext(Helpers.scala:661)
[info] at play.api.mvc.PlayBodyParsers.$anonfun$enforceMaxLength$1(BodyParsers.scala:866)
[info] at akka.stream.impl.Compose.apply(TraversalBuilder.scala:164)
[info] at akka.stream.impl.PhasedFusingActorMaterializer.materialize(PhasedFusingActorMaterializer.scala:488)
[info] at akka.stream.impl.PhasedFusingActorMaterializer.materialize(PhasedFusingActorMaterializer.scala:424)
[info] at akka.stream.impl.PhasedFusingActorMaterializer.materialize(PhasedFusingActorMaterializer.scala:415)
[info] at akka.stream.scaladsl.RunnableGraph.run(Flow.scala:496)
est en dessous du contrôleur je l'ai écrit pour illustrer le problème
case class Location(lat: Double, long: Double)
object Location {
implicit val locationReads: Reads[Location] = (
(JsPath \ "lat").read[Double](min(-90.0) keepAnd max(90.0)) and
(JsPath \ "long").read[Double](min(-180.0) keepAnd max(180.0))
) (Location.apply _)
}
class HomeController @Inject()(
cc: ControllerComponents,
mat: Materializer
)(implicit val ec: ExecutionContext) extends AbstractController(cc) {
def savePlace: Action[JsValue] = Action(parse.json) { request: Request[JsValue] =>
val placeResult = request.body.validate[Location]
placeResult.fold(
errors => {
BadRequest(Json.obj("status" -> "KO", "message" -> JsError.toJson(errors)))
},
place => {
Ok(Json.obj("status" -> "OK", "message" -> "Location saved"))
}
)
}
}
et le code de test
class HomeControllerSpec extends PlaySpec with Injecting with Inside with GuiceOneAppPerSuite with BeforeAndAfterEach with Results with BeforeAndAfterAll {
implicit lazy override val app: play.api.Application = new GuiceApplicationBuilder().configure().build()
implicit lazy val materializer: Materializer = app.materializer
implicit lazy val components = Helpers.stubControllerComponents()
"savePlace" must {
val api = new HomeController(components, mat = materializer)
val payload = Json.obj(
"location" -> Json.obj("lat" -> 51.235685, "lng" -> -1.309197)
)
"just demo" in {
val request = FakeRequest(POST, "/location").withJsonBody(payload)
val result = call(api.savePlace, request)
status(result) mustBe UNAUTHORIZED
}
}
}
J'utilise le jeu 2.6.3
Merci de m'avoir invité. J'ai trouvé comment résoudre le problème pour mon cas d'utilisation et j'ai répondu à la question pour quelqu'un d'autre qui pourrait y faire face aussi. Les contrôleurs que je suis en train de tester ont beaucoup de dépendances et je veux tester uniquement le code spécifique au contrôleur. J'ai donc besoin de les instancier manuellement un par un en testant leurs fonctionnalités. – ivanorone