2013-06-09 13 views
6

Chcę napisać test dla mojego kontrolera:kontroler Testowanie z fałszywymi sesji

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

Mam kod stanu HTTP - 300.

Zgadza się to przekierowanie bo mam klasy o nazwie zabezpieczone

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())); 
    } 


} 

A kiedy używam @Security.Authenticated(Secured.class) adnotacji do metody kontrolera przekierowuje jeśli sesja z „userid” nie istnieje.

Pytanie brzmi: jak mogę sfałszować sesję?

Próbowałem oczywiście zadzwonić Controller.session("usderId", "2");

I got wyjątek:

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) 

Moje pytanie brzmi: w jaki sposób fałszywy sesji dla kontrolera?

I jedno dodatkowe pytanie: jak testować trasy bez używania przestarzałego API, np. Result result = routeAndCall(fakeRequest(GET, "/change_password"));?

Odpowiedz

6

Możesz użyć metody withSession(String, String) z fakeRequest, aby umieścić rzeczy w sesji. Zwróć uwagę, że to zwraca wartość fakeRequest, więc możesz połączyć tę metodę, jeśli chcesz umieścić wiele kluczy w sesji.

test mógłby wtedy wyglądać tak:

@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)); 
     } 
    }); 
} 

Należy również zauważyć, że stosowane metody route i nie routeAndCall, pierwszy jest zastąpienie nieaktualnych metody.

+0

Znajduję rozwiązanie 3 minuty temu, zanim przejrzę na twoją odpowiedź. W każdym razie dziękuję, znowu! :RE –