如何在Play Framework 1.2.3中的功能测试中伪造会话值?
我正在做一个简单的测试,如:
在运行测试之前,我设置了一个空白会话,希望它能成为测试的一部分:
@Before public void setupHTTP() { Session.current.set(new Session()); }
@Test public void testRedirectToUserHomeForAuthenticatedUserWhenBlankAction() { authenticateUser("test@user.com"); Response response = GET("/user/blank"); assertRedirected(response, "/user/home"); }
方法
authenticate(String userEmail)只需将关键字“用户名”放在会话地图中:
protected void authenticateUser(String userEmail) { // Put in session the email Session.current.get().put(USERNAME, userEmail); }
但是测试运行在另一个线程中,只要我能理解,并且没有看到我设置的会话......
如何在功能测试中伪造会话值?
答案 0 :(得分:3)
我遇到了同样的问题,但是在Play 2.0.4的测试中。
我按照Seb和Codemwnci的答案解决了这个问题,并构建了检查API,以下解决方案:
@Test
public void listSomething() {
running(fakeApplication(inMemoryDatabase()), new Runnable() {
@Override
public void run() {
// LOGIN
final Map<String, String> data = new HashMap<String, String>();
data.put("email", "user@domain.com");
data.put("password", "userpassword");
Result result = callAction(
controllers.routes.ref.Application.authenticate(),
fakeRequest().withFormUrlEncodedBody(data));
// RECOVER COOKIE FROM LOGIN RESULT
final Cookie playSession = play.test.Helpers.cookie("PLAY_SESSION",
result);
// LIST SOMETHING (using cookie of the login result)
result = callAction(controllers.routes.ref.Application.list(),
fakeRequest().withCookies(playSession));
/*
* WAS RECEIVING 'SEE_OTHER' (303)
* BEFORE RECOVERING PLAY_SESSION COOKIE (BECAUSE NOT LOGGED IN).
*
* NOW, EXPECTED 'OK'
*/
assertThat(status(result)).isEqualTo(OK);
assertThat(contentAsString(result)).contains(
"Something found");
}
});
}
Application.list()是这样的:
@Security.Authenticated(Secured.class)
public static Result list() {
return ok(list.render(...));
}
答案 1 :(得分:2)
为什么要伪造,你可以通过在请求之间携带cookie来验证用户并在功能测试中使用其会话。
像
这样的东西Response response = makeRequest(...); // connexion request
Request request = newRequest(...); // new request
request.cookies = response.cookies
通过获取您之前回复的Cookie来进行会话