получение Материализационной ошибки в Play Framework, только если аргумент изменяется и Силуэт не аутентифицирует запрос - PullRequest
0 голосов
/ 12 апреля 2019

Я наблюдаю странное поведение. Я получаю следующую ошибку, но только если я использую определенное значение. В противном случае я не. Почему это так?

Error:(1699, 39) could not find implicit value for parameter mat: akka.stream.Materializer
      val responseBody = contentAsJson(response)
Error:(1699, 39) not enough arguments for method contentAsJson: (implicit timeout: akka.util.Timeout, implicit mat: akka.stream.Materializer)play.api.libs.json.JsValue.
Unspecified value parameter mat.
      val responseBody = contentAsJson(response)

Я хочу проверить метод signout.

def signOutUser = silhouette.SecuredAction.async { implicit request =>
    println("in sign out")

    silhouette.env.authenticatorService.discard(request.authenticator, Ok(Json.toJson(JsonResultSuccess("signout successful"))))
  }

Чтобы выполнить его модульное тестирование, я создал следующий тестовый пример (он создает аутентификатор JWT, создает строку JWT (вызов init), встраивает ее в запрос, а затем я использую метод моего контроллера с этим запрос

"signOutUser" should {
    "should be called when signout request is received" in {
      val testEnv = new TestEnv(components.configuration)

      val fakeJWTAuthenticatorService = new FakeJWTAuthenticatorService()

      val request = FakeRequest("POST", "ws/users/user-signout")
      val jwtAuthenticator = await[JWTAuthenticator](fakeJWTAuthenticatorService.create(testEnv.loginInfo)(request))

      val jwtInfo = await[String](fakeJWTAuthenticatorService.init(jwtAuthenticator)(request))
      println("jwt init is ", jwtInfo) //prints the JWT content OK
      val securedRequest = fakeJWTAuthenticatorService.embed(jwtInfo,request)

      for(header <- securedRequest.headers.headers) {
        println(s"header ${header}")//just checcking that the header is security there
      }

      val response = testEnv.controller.signOutUser(securedRequest)

      val responseBody = contentAsJson(response)
      println(s"response is ${responseBody}")
      1 mustBe 1
    }
  }

Класс TestEnv имеет два значения

class TestEnv (configuration:Configuration){
  implicit val sys = ActorSystem("MyTest") //required by materializer
  implicit val mat = ActorMaterializer() //required by akka framework
..
}

Интересно, что если я не использую securedRequest, но использую только request, то я не получаю ошибку, но мой тестовый пример не проходит, потому что Silhouette не может аутентифицировать запрос и возвращает HTML вместо JSON (<html><head><title>silhouette.not.authenticated</title></head><body>silhouette.not.authenticated</body></html>)

Вопрос 1 - Почему я получаю ошибку implicit при использовании securedRequest? Почему я не получаю ошибку, если я использую request.

Вопрос 2 - Почему последствия, определенные в TestEnv, не используются?

Вопрос 3 Я мог бы обойти эту проблему, явно передав необходимые неявные параметры

val duration = FiniteDuration(1000,"millis")
      val responseBody = contentAsJson(response)(new akka.util.Timeout(duration),testEnv.mat)

Но мой тестовый пример все еще не удался, потому что silhouette не аутентифицировал его, даже если сообщение содержит маркер безопасности X-Auth-Token.

Как мне пройти тестовый набор?

...