2012-03-26 1 views
5

Java 2.0에서 Play 2.0의 fakeRequest를 사용할 때 세션을 유지할 방법을 찾고 있지만, 스칼라 기반 JAR. 스칼라 질문 Add values to Session during testing (FakeRequest, FakeApplication)에 언급 된 풀 요구를 바탕으로 Play 2.0의 fakeRequest에 대한 후속 Java 호출에서 세션을 유지하십시오.

, 나는 생각 자바에서 작동 할 수 있습니다 다음

public Session getSession(Result result) { 
    play.api.mvc.Cookies scalaCookies = 
     play.api.test.Helpers.cookies(result.getWrappedResult()); 
    play.api.mvc.Cookie scalaSessionCookie = 
     scalaCookies.get(play.api.mvc.Session.COOKIE_NAME()).get(); 
    scala.Option<play.api.mvc.Cookie> optionalCookie = 
     scala.Option.apply(scalaSessionCookie); 

    // Compiles fine, but fails with NoSuchMethodError: 
    play.api.mvc.Session scalaSession = 
     play.api.mvc.Session.decodeFromCookie(optionalCookie); 

    return new play.mvc.Http.Session(Scala.asJava(scalaSession.data())); 
} 

이 잘 컴파일하지만 테스트를 실행하는 동안 그것은 나를 가져옵니다

java.lang.NoSuchMethodError: 
    play.api.mvc.Session.decodeFromCookie(Lscala/Option;)Lplay/api/mvc/Session; 

Scala newby이기 때문에 나는 가까이에 있는지 전혀 알지 못합니다. 스칼라 세션 does expose (trait) that method through CookieBaker, I 으로 생각합니다.

위의 코드를 실행하는 방법을 반드시 찾지는 않습니다. 위의 내용은 실제로 세션을 가져 오는 첫 번째 (가능한) 단계입니다. 다음으로 나는 아마도 play.api.mvc.Session.encodeAsCookie(session)과 같은 것을 사용하여 후속 요청에 전달하려고합니다. the ZenTasks demo에 대한처럼 : 1.x에서 들어

@Test 
public void testLoginAndMore() { 
    Helpers.running(Helpers.fakeApplication(Helpers.inMemoryDatabase()), 
    new Runnable() { 
    public void run() { 
     Map<String, String> data = new HashMap<String, String>(); 
     data.put("email", "[email protected]"); 
     data.put("password", "secret"); 

     Result result = 
     callAction(controllers.routes.ref.Application.authenticate(), 
      fakeRequest().withFormUrlEncodedBody(data)); 
     assertThat(status(result)).isEqualTo(Status.SEE_OTHER); 
     assertThat(redirectLocation(result)).isEqualTo("/"); 

     // All fine; we're logged in. Now somehow preserve the cookie. This 
     // does NOT do the trick: 
     Session session = getSession(result); 
     // ...subsequent callAction(..)s, somehow passing the session cookie 
    } 
    }); 
} 

, Playframework Secure module: how do you “log in” to test a secured controller in a FunctionalTest?가 도움이되지만 일들이 2.0에서 변경된 것, 내가 1.x 버전을 사용한 적이

+0

(또한 [재생 워크 Google 그룹에 관련된 게시물 (https://groups.google.com/forum/#!searchin/play-framework/session/play-framework/FuXaP7z9wz8)에 첨가 (해당되는 경우이 게시물과 동기화되어 유지됩니다.) – Arjan

+0

Google 그룹스의 Peter Hausel은 방금 다음과 같이 썼습니다. * 안녕하세요, 쿠키와 플래시 지원과 함께 오늘이 문제를 해결할 예정입니다. 고마워 피터 * – Arjan

답변

6

마술은별로 필요하지 않습니다. 다음은 간단하게 쿠키를 설정하는 HTTP 헤더를 보존하고, 다음 요청에 있음을 전달합니다.

Map<String, String> data = new HashMap<String, String>(); 
data.put("email", "[email protected]"); 
data.put("password", "secret"); 

Result result = callAction(controllers.routes.ref.Application.authenticate(), 
    fakeRequest().withFormUrlEncodedBody(data)); 

assertThat(status(result)).isEqualTo(Status.SEE_OTHER); 
assertThat(redirectLocation(result)).isEqualTo("/"); 
// All fine; we're logged in. Preserve the cookies: 
String cookies = header(HeaderNames.SET_COOKIE, result); 

// Fetch next page, passing the cookies 
result = routeAndCall(fakeRequest(GET, redirectLocation(result)) 
    .withHeader(HeaderNames.COOKIE, cookies)); 

assertThat(status(result)).isEqualTo(Status.OK); 
assertThat(contentAsString(result).contains("Guillaume Bort")); 

가 (단지 PLAY_SESSION 쿠키를 받고, 그 구문 분석에 대한 몇 가지 정보이 매우 대답 the first version 참조 즉 거의 없다).

+0

고마워이 답변을 많이. – Mikesname

3

현재 버전의 Play에서는 테스트에서 세션을 사용하는 것이 쉽습니다. cookies(Result result) 정적 도우미 방법을 사용할 수 있습니다.

// Route that sets some session data to be used in subsequent requests 
Result result = callAction(...); 
Http.Cookie[] cookies = FluentIterable.from(cookies(result)).toArray(Http.Cookie.class); 

FakeRequest request = new FakeRequest(GET, "/someRoute").withCookies(cookies); 
callAction(controllers.routes.ref.Application.requestNeedingSession(), request); 
관련 문제