2013-06-09 19 views
6

Tôi muốn viết bài kiểm tra cho bộ điều khiển của tôi Kiểm tra:điều khiển với phiên giả

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

Tôi có một mã trạng thái http - 300.

Đúng nó là chuyển hướng bởi vì tôi có một lớp có tên Bảo đảm

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


} 

Và khi tôi sử dụng chú thích @Security.Authenticated(Secured.class) cho phương pháp điều khiển, nó sẽ chuyển hướng nếu phiên có "userId" không tồn tại.

Vì vậy, câu hỏi đặt ra là làm thế nào tôi có thể giả mạo phiên?

tôi đã cố gắng rõ ràng gọi Controller.session("usderId", "2");

Và có một ngoại lệ:

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) 

Câu hỏi của tôi là: Làm thế nào để giả mạo phiên cho bộ điều khiển?

Và một câu hỏi bổ sung: cách kiểm tra tuyến đường mà không sử dụng API không dùng nữa, như Result result = routeAndCall(fakeRequest(GET, "/change_password"));?

Trả lời

6

Bạn có thể sử dụng phương pháp withSession(String, String)fakeRequest để đặt mọi thứ trong Phiên. Lưu ý rằng điều này trả về một fakeRequest để bạn có thể kết nối phương thức đó nếu bạn cần đặt nhiều khóa trong phiên.

thử nghiệm của bạn sau đó có thể trông giống như thế này:

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

Cũng lưu ý rằng tôi đã sử dụng phương pháp route và không routeAndCall, người đầu tiên là sự thay thế của phương pháp phản đối.

+0

Tôi tìm giải pháp 3 phút trước, trước khi xem câu trả lời của bạn. Dù sao cảm ơn bạn, một lần nữa! : D –