繁体   English   中英

rails test仅在get请求中传递CSRF令牌

[英]rails test passing CSRF token only in get requests

我试图单元测试我的控制器,使用的每个测试get请求工作正常,但如果我用其他电话(测试delete的破坏, post在创建和put在更新)失败了:

WARNING: Can't verify CSRF token authenticity
Completed 401 Unauthorized in 2.5ms

例如,这是对破坏的测试:

  test "should destroy blog" do
    assert_difference('Blog.count', -1) do
      delete :destroy, id: @blog
    end

    assert_redirected_to blogs_path
  end

这不起作用

这是show的测试,它起作用:

  test "should show blog" do
    get :show, id: @blog
    assert_response :success
  end

在破坏测试中,设计authenticate_user! 只是将我重定向到sign_in页面,测试失败。

显然,在测试环境中禁用CSRF令牌是正常的,我补充说:

  # Disable request forgery protection in test environment
  config.action_controller.allow_forgery_protection    = false

到我的“/config/environments/test.rb”文件,当前用户能够通过。

通过authenticate_user!获取authenticate_user! ,您需要包含并使用Devise测试助手,如下所示:

https://github.com/plataformatec/devise#test-helpers

class ActionController::TestCase
  include Devise::TestHelpers
end

并在您的测试中使用它们:

  test "should show blog" do
    @user = users(:one) # or FactoryGirl.create(:user), or User.create!(email: 'foo@bar.com')
    sign_in @user
    get :show, id: @blog
    assert_response :success
  end

对于CSRF令牌,您的表单是使用form_for还是其他一些表单构建器构建的?

这些会自动将CSRF令牌添加到表单有效内容中。 如果您使用裸<form>标记标记编写表单,则必须将其自己添加到表单中,如下所示:

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM