在Play框架2.5(Scala)中使用CSRF令牌进行测试请求

时间:2016-10-25 23:30:45

标签: scala unit-testing playframework playframework-2.5

我在功能测试中遇到了一个小问题。

我玩了! 2.5 scala项目,其中我在某些表单上添加了CSRF验证,相关的scala-test单元测试失败,正如所料,错误:

java.lang.RuntimeException: No CSRF token present!

我在路线上使用FakeRequest来测试它们:

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

我如何添加CRSF令牌以便再次成功完成测试?

(谢谢你,抱歉英语不好,我不是本地人)

1 个答案:

答案 0 :(得分:7)

更新:像haui在评论中所说:

  

似乎他们在游戏版本2.6中添加了类似的内容。您可以使用import play.api.test.CSRFTokenHelper._ FakeRequest().withCSRFToken

中所述的CSRFTokenHelper.addCSRFToken(requestBuilder)(Scala)和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)) } } (Java)

对于仍然在2.5.6的人,我的答案仍然适用:

所以,在看了Play-scala课程一段时间之后,我终于找到了一种方法来调整这个答案:Migration guide到Play 2.5.6

我甚至做了一个特性,所以如果有人需要它,那么它就是:

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

要使用它,只需使用它扩展您的测试类,如下所示:

val fakeRequest = FakeRequest(/* params */)

然后,而不是调用

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

只需致电

if(isset($_POST["productName"]))

我试图让它看起来像Controller中的addToken {}:)