Testando um aplicativo Play2 com SecureSocial usando injeção de dependência
Muito obrigado por qualquer orientação!
O plug-in SecureSocial funciona bem quando eu o executo no navegador, mas gostaria de poder testar o restante do meu aplicativo do Google Play agora.
Introdução rápidaA sintaxe da SecureSocial é assim:
def page = SecuredAction(WithProvider("google")) { ... }
ou isto:
def page = UserAwareAction { ... }
Estive olhandoAqui, o que parece ser a única questão sobre o Stack Overflow, mesmo remotamente relacionada ao meu problema com SecureSocial, mas eu não gosto muito de reconectar o bytecode. Deveria haver uma solução mais simples para isso.
Quando estou executando testes que acessam Ações protegidas pelo SecureSocial, recebo um grande erro que, basicamente, significa que não estou passando a ele um usuário. (veja o final desta questão)
O que eu gostaria de fazerInjete todas as funções para retornar um tipoAction
ao invés deSecuredAction
ouUserAwareAction
somente durante o teste
Ou, na verdade, passar um usuário de teste para a chamada.Mas como?
O que eu tenho@Singleton
class JsonOps @Inject() () extends Controller with SecureSocial {...}
A Global.scala
escrito como descritoAqui e no meu teste ...
val controller = new JsonOps
val result = controller.userAwareActionRequestForSomeJson("")(FakeRequest())
Eu também tenho chamadas assim:
// This is what I would use for production
def extjs = SecuredAction(WithProvider("google")) { implicit request =>
Ok(views.html.extjs(request.user.firstName))
}
// This is what I would use for testing
def extjs = Action { implicit request =>
Ok(views.html.extjs("testtesttesting"))
}
É por isso que acho que esse problema pode ser adequado para injeção de dependência? Eu não tenho certeza como eu faria a instanciação de classe, já que o Global.scala que estou usando é um instanciador de classe genérico. Eu particularmente não desejo escrever 9000+ traços para cada controlador que possuo.
O grande erroEsta é a linha UserOpsSpec.scala da linha 12 e 13:
12 val controller = new UserOps
13 val result = controller.extjs()(FakeRequest())
e esse é o erro
[error] RuntimeException: java.lang.ExceptionInInitializerError (UserOpsSpec.scala:13)
[error] play.api.mvc.ActionBuilder$anon$1.apply(Action.scala:220)
[error] securesocial.core.SecureSocial$.authenticatorFromRequest(SecureSocial.scala:200)
[error] securesocial.core.SecureSocial$anonfun$SecuredAction$1.apply(SecureSocial.scala:81)
[error] securesocial.core.SecureSocial$anonfun$SecuredAction$1.apply(SecureSocial.scala:78)
[error] play.api.mvc.ActionBuilder$anon$1.apply(Action.scala:215)
[error] play.api.Play$anonfun$current$1.apply(Play.scala:51)
[error] play.api.Play$anonfun$current$1.apply(Play.scala:51)
[error] play.api.Play$.current(Play.scala:51)
[error] securesocial.core.Authenticator$.cookieName$lzycompute(Authenticator.scala:188)
[error] securesocial.core.Authenticator$.cookieName(Authenticator.scala:188)
[error] securesocial.core.Authenticator$.<init>(Authenticator.scala:201)
[error] securesocial.core.Authenticator$.<clinit>(Authenticator.scala)
[error] securesocial.core.SecureSocial$.authenticatorFromRequest(SecureSocial.scala:200)
[error] securesocial.core.SecureSocial$anonfun$SecuredAction$1.apply(SecureSocial.scala:81)
[error] securesocial.core.SecureSocial$anonfun$SecuredAction$1.apply(SecureSocial.scala:78)
[error] play.api.mvc.ActionBuilder$anon$1.apply(Action.scala:215)
[error] null
[error] securesocial.core.SecureSocial$.authenticatorFromRequest(SecureSocial.scala:200)
[error] securesocial.core.SecureSocial$anonfun$SecuredAction$1.apply(SecureSocial.scala:81)
[error] securesocial.core.SecureSocial$anonfun$SecuredAction$1.apply(SecureSocial.scala:78)
[error] play.api.mvc.ActionBuilder$anon$1.apply(Action.scala:215)
[error] There is no started application
[error] play.api.Play$anonfun$current$1.apply(Play.scala:51)
[error] play.api.Play$anonfun$current$1.apply(Play.scala:51)
[error] play.api.Play$.current(Play.scala:51)
[error] securesocial.core.Authenticator$.cookieName$lzycompute(Authenticator.scala:188)
[error] securesocial.core.Authenticator$.cookieName(Authenticator.scala:188)
[error] securesocial.core.Authenticator$.<init>(Authenticator.scala:201)
[error] securesocial.core.Authenticator$.<clinit>(Authenticator.scala)
[error] securesocial.core.SecureSocial$.authenticatorFromRequest(SecureSocial.scala:200)
[error] securesocial.core.SecureSocial$anonfun$SecuredAction$1.apply(SecureSocial.scala:81)
[error] securesocial.core.SecureSocial$anonfun$SecuredAction$1.apply(SecureSocial.scala:78)
[error] play.api.mvc.ActionBuilder$anon$1.apply(Action.scala:215)
[info]