6

コントローラーのテストを書きたい:

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

http ステータス コード - 300 があります。

Securedという名前のクラスがあるため、リダイレクトです

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


}

そして、@Security.Authenticated(Secured.class)コントローラーメソッドにアノテーションを使用すると、「userId」のセッションが存在しない場合にリダイレクトされます。

問題は、どうすればセッションを偽造できるかということです。

明らかに電話してみたController.session("usderId", "2");

そして例外を得ました:

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)

私の質問は: コントローラーのセッションを偽造する方法は?

追加の質問: 非推奨の API を使用せずにルートをテストする方法はResult result = routeAndCall(fakeRequest(GET, "/change_password"));?

4

1 に答える 1