Я наблюдаю странное поведение. Я получаю следующую ошибку, но только если я использую определенное значение. В противном случае я не. Почему это так?
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
.
Как мне пройти тестовый набор?