Testen einer Play2-Anwendung mit SecureSocial mithilfe von Dependency Injection

Vielen Dank für jede Anleitung!

Das SecureSocial-Plugin funktioniert einwandfrei, wenn ich es über den Browser starte, aber ich möchte jetzt den Rest meiner Play-App testen können.

Schnelles Intro

Die Syntax von SecureSocial sieht folgendermaßen aus:

def page = SecuredAction(WithProvider("google")) { ... }

oder dieses:

def page = UserAwareAction { ... }

Ich habe gesuchtHierDies scheint die einzige Frage zu Stack Overflow zu sein, die sich auch nur aus der Ferne auf mein Problem mit SecureSocial bezieht, aber ich habe keine Lust, Bytecode neu zu verdrahten. Hier sollte es eine einfachere Lösung geben.

Wenn ich Tests durchführe, die auf SecureSocial-geschützte Aktionen zugreifen, wird eine große Fehlermeldung angezeigt, die im Grunde genommen bedeutet, dass ich sie nicht an einen Benutzer weitergebe. (siehe unten in dieser Frage)

Was ich gerne machen würde

Fügen Sie entweder alle Funktionen ein, um einen Typ zurückzugebenAction anstattSecuredAction oderUserAwareAction nur während des Testens

Oder übergeben Sie tatsächlich einen Testbenutzer an den Anruf.Aber wie?

Was ich habe
@Singleton
class JsonOps @Inject() () extends Controller with SecureSocial {...}

A Global.scala geschrieben wie beschriebenHier und in meinem Test ...

val controller = new JsonOps
val result = controller.userAwareActionRequestForSomeJson("")(FakeRequest())

Ich habe auch solche Anrufe:

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

Was ist der Grund, warum ich denke, dass dieses Problem für die Abhängigkeitsinjektion gut geeignet ist? Ich bin nicht sicher, wie ich die Klasseninstanziierung durchführen würde, da die von mir verwendete Global.scala ein generischer Klasseninstanziator ist. Ich möchte nicht besonders über 9000 Merkmale für jeden Controller schreiben, den ich habe.

Der große Fehler

Dies ist die Zeile UserOpsSpec.scala, Zeile 12 und 13:

12  val controller = new UserOps
13  val result = controller.extjs()(FakeRequest())

und das ist der fehler

[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]

Antworten auf die Frage(1)

Ihre Antwort auf die Frage