仅当参数更改且Silhouette不能验证请求时,才在Play Framework中出现Materializer错误

时间:2019-04-12 07:05:37

标签: scala silhouette

我正在观察奇怪的行为。我得到以下错误,但前提是我使用了某个值。否则我不会。为什么呢?

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字符串(初始化调用),将其嵌入到请求中,然后我将所有该请求的控制器方法

"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)

但是我的测试用例仍然失败,因为即使消息包含安全令牌silhouetteX-Auth-Token也没有对其进行身份验证。

如何使我的测试用例通过?

0 个答案:

没有答案