2013-06-09 6 views
6

I-Test für meinen Controller schreiben will:Testing Controller mit gefälschter Session

Result changeAction = callAction(controllers.routes.ref.Users.changePassword()); 
assertThat(status(changeAction)).isEqualTo(OK); 

Ich habe eine HTTP-Statuscode - 300.

Das ist richtig es ist umleiten, weil ich eine Klasse mit dem Namen gesichert

package controllers; 

import play.mvc.*; 
import play.mvc.Http.*; 

public class Secured extends Security.Authenticator { 

    @Override 
    public String getUsername(Context ctx) { 
     return ctx.session().get("userId"); 
    } 

    @Override 
    public Result onUnauthorized(Context ctx) { 
     return redirect(routes.Users.login(ctx.request().uri())); 
    } 


} 

Und wenn ich die @Security.Authenticated(Secured.class) Anmerkung für Controller-Methode verwenden, leitet es automatisch, wenn Session mit „userId“ tun existiert nicht.

Die Frage ist also, wie kann ich die Sitzung vortäuschen?

Ich habe versucht, rufen offenbar Controller.session("usderId", "2");

Und bekam eine Ausnahme:

java.lang.RuntimeException: There is no HTTP Context available from here. 

    at play.mvc.Http$Context.current(Http.java:30) 
    at play.mvc.Controller.session(Controller.java:54) 
    at play.mvc.Controller.session(Controller.java:61) 
    at controllers.UsersTest.testUnloginedChangePassword(UsersTest.java:35) 

Meine Frage ist: Wie wird die Sitzung für Controller zu fälschen?

Und eine weitere Frage: Wie Routen ohne veraltete API, wie Result result = routeAndCall(fakeRequest(GET, "/change_password")); testen?

Antwort

6

Sie können die withSession(String, String) Methode von fakeRequest verwenden, um Dinge in die Sitzung zu stellen. Beachten Sie, dass dies eine fakeRequest zurückgibt, so dass Sie diese Methode verketten können, wenn Sie mehrere Schlüssel in die Sitzung einfügen müssen.

Ihr Test könnte dann wie folgt aussehen:

@Test 
public void test() { 
    running(fakeApplication(), new Runnable() { 
     public void run() { 
      String username = "Aerus"; 
      Result res = route(fakeRequest("GET", "/") 
          .withSession("username", username) 
          .withSession("key","value")); 
      assert(contentAsString(res).contains(username)); 
     } 
    }); 
} 

Beachten Sie auch, dass ich die route Methode verwendet und nicht routeAndCall, die erste der Ersatz der veralteten Methode.

+0

Ich finde die Lösung vor 3 Minuten, bevor Sie auf Ihre Antwort schauen. Wie auch immer, danke nochmal! : D –

Verwandte Themen