我正在观察奇怪的行为。我得到以下错误,但前提是我使用了某个值。否则我不会。为什么呢?
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)
但是我的测试用例仍然失败,因为即使消息包含安全令牌silhouette
,X-Auth-Token
也没有对其进行身份验证。
如何使我的测试用例通过?