2011-11-14 3 views
3

Play Framework 1.2.3の機能テストでセッション値をどのように偽装しますか?私のような簡単なテストやってる機能テストでは、Play FrameworkでSecureモジュールを使用して認証されたユーザーを偽装する方法を教えてください。

 
@Before 
public void setupHTTP() { 
    Session.current.set(new Session()); 
} 
 
@Test 
public void testRedirectToUserHomeForAuthenticatedUserWhenBlankAction() { 
    authenticateUser("[email protected]"); 
    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); 
} 

しかしにおけるテストの実行を私が理解できる限り、別のスレッド、設定したセッションが表示されません...

機能テストでセッション値を偽装する方法はありますか?

答えて

2

なぜあなたは偽造したいのですか?リクエスト間でクッキーを運ぶことで、ユーザーを認証し、機能テストでそのセッションで作業できます。あなたのセッション

+0

こんにちは:

@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", "[email protected]"); 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()がこのようなものですSeb、コントローラの私の行動は、認証されたユーザを持つかどうかに応じて異なった動作をするはずです。とにかく、私はあなたの答えをよく理解していませんでした。機能テスト中にセッションで値を設定する方法をさらに説明できますか?ありがとうございます –

+0

私の解決策は、セッションで値を入れないで実際にユーザーを認証するため、ユーザーのアプリケーションを使用する場合と全く同じように振る舞います。 –

+0

あなたは正しいです。私はまだ認証を実装せずに何かをテストしようとしていましたが、機能テストではシステムのさまざまな部分の統合をテストする必要がありました。 私は認証を実装しただけでPOST( "/ login"、params)を作成してから、他の要求を行うことができます。ありがとう。 –

3

を運ぶ前のレスポンスのクッキーを取得することによって

Response response = makeRequest(...); // connexion request 
Request request = newRequest(...); // new request 
request.cookies = response.cookies 

よう

何かが、私は同じ問題を抱えていたが、プレイ2.0.4でテストしました。

私はSebCodemwnci答えに従うことによって、問題を解決し、私が構築され、APIをチェックし、次のソリューション:

@Security.Authenticated(Secured.class) 
public static Result list() { 
    return ok(list.render(...)); 
} 
関連する問題