我想为我的控制器编写测试:
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"));
?
您可以使用withSession(String, String)
的方法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
方法而不是routeAndCall
,首先是替换已弃用的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)