簡體   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