簡體   English   中英

用假會話測試控制器

[英]Testing controller with fake session

我想為我的控制器編寫測試:

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 ,第一個是替換不推薦使用的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM