2016-10-25 8 views
5

私の機能テストでは少し問題が残っています。Playフレームワーク2.5(Scala)のCSRFトークンによるテストリクエスト

私はPlay!

java.lang.RuntimeException: No CSRF token present! 

私はそれをテストするためにルートとFakeRequestを使用している:予想通り、私はいくつかの形態でCSRF検証を加えた2.5 Scalaのプロジェクトは、関連するスカラテストユニットテストはエラーで、失敗した

val fakeRequest = FakeRequest(GET, s"/backOffice/login") 
val Some(result) = route(app, fakeRequest) 

テストをもう一度成功させるためにCRSFトークンを追加するにはどうすればよいですか?

(ありがとう、と悪い英語のため申し訳ありませんが、私はネイティブではないよ)

+1

いくつかのヘッダーを[here](https://www.playframework.com/documentation/2.5.x/ScalaCsrf#Plays-CSRF-protection)のようにCSRFをバイパスするように設定します。または[this](http://stackoverflow.com/a/19849420/4496364)の回答を見てください。 –

+0

こんにちは、感謝してくれてありがとう! テンプレートをテストしていて、アクションごとにCSRF保護を行っていることを前もって確信しておく必要があります(ドキュメントの2番目のケースで、フィルタ付きの最初のケースではありません)。このため、CSRFをバイパスすることはできません。私のテンプレートでは、既にテスト済みの2番目のリンクのように、FakeRequestにCSRFトークンが必要です(あまりにも申し訳ありません)。 .1、Intellijが私に叫んでいる "SignedTokenProviderシンボルを解決できません" あなたはプレイ2.5でそれをどうやって行うことができるのでしょうか? – Argurth

+1

解決策を見つけて特質を作った:)あなたが興味を持っていれば私が追加した答えを見てください^^ – Argurth

答えて

5

更新:同様hauiは彼のコメントで述べている:彼らはプレーバージョン2.6で似たような追加のよう

は思えます。そこにはFakeRequestを()を使用することができwithCSRFToken(スカラ座)とCSRFTokenHelper.addCSRFToken(requestBuilder)(Javaの)2.5.6に残っている人たちのためにMigration guide

で説明したように、私の答えはまだ適用されます。

ので、一定時間プレイ、Scalaのクラスで見た後、私は最終的にこの答えを適合させる方法を見つけた:https://stackoverflow.com/a/19849420/4496364 2.5.6

を再生するために、誰かが一日、それを必要とするので、もし私も、形質を作っここにあります:

import play.api.Application 
import play.api.test.FakeRequest 
import play.filters.csrf.CSRF.Token 
import play.filters.csrf.{CSRFConfigProvider, CSRFFilter} 

import scala.language.postfixOps 

trait CSRFTest { 
    def addToken[T](fakeRequest: FakeRequest[T])(implicit app: Application) = { 
    val csrfConfig  = app.injector.instanceOf[CSRFConfigProvider].get 
    val csrfFilter  = app.injector.instanceOf[CSRFFilter] 
    val token   = csrfFilter.tokenProvider.generateToken 

    fakeRequest.copyFakeRequest(tags = fakeRequest.tags ++ Map(
     Token.NameRequestTag -> csrfConfig.tokenName, 
     Token.RequestTag  -> token 
    )).withHeaders((csrfConfig.headerName, token)) 
    } 
} 

単にこのように、それをあなたのテストクラスを拡張し、それを使用するには:その後、

class LoginSpec extends PlaySpec with OneAppPerSuite /* or whatever OneApp */ with CSRFTest 

、代わりに単に

val fakeRequest = addToken(FakeRequest(/* params */)) 

を呼び出す

val fakeRequest = FakeRequest(/* params */) 

を呼び出す私が作ってみましたそれはコントローラのaddToken {}のように見えます:)

+3

プレイバージョン2.6で類似しているようです。 [Migration guide](https://www.playframework.com/documentation/2.6)で説明したように、 'FakeRequest().CSRFToken'(Scala)と' CSRFTokenHelper.addCSRFToken(requestBuilder) '(Java)を使うことができます。x/Migration26#testing-with-csrffilter) – haui

+0

ありがとう!私は自分の答えを編集した – Argurth

関連する問題