我在功能测试中遇到了一个小问题。
我玩了! 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令牌以便再次成功完成测试?
(谢谢你,抱歉英语不好,我不是本地人)
答案 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 {}:)