用假会话测试控制器

时间:2013-06-09 07:46:17

标签: java testing playframework-2.1

我想为我的控制器编写测试:

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"));

1 个答案:

答案 0 :(得分:6)

您可以使用withSession(String, String)的{​​{1}}方法将内容放入会话中。请注意,这会返回fakeRequest,因此如果需要在会话中放置多个键,则可以链接该方法。

您的测试可能看起来像这样:

fakeRequest

另请注意,我使用的是@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)); } }); } 方法,而不是route,第一种方法是替换弃用的方法。