【问题标题】:rails test passing CSRF token only in get requestsrails 仅在获取请求中测试通过 CSRF 令牌
【发布时间】:2014-10-02 04:34:13
【问题描述】:

我正在尝试对我的控制器进行单元测试,每个使用 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

这不起作用

这是表演的测试,有效:

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

在销毁测试中,设计authenticate_user! 只是将我重定向到登录页面并且测试失败。

【问题讨论】:

    标签: ruby-on-rails unit-testing testing devise csrf


    【解决方案1】:

    要获得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 Token,您的表单是使用 form_for 还是其他表单构建器构建的?

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

    <%= hidden_field_tag :authenticity_token, form_authenticity_token %>
    

    【讨论】:

    • 谢谢,我的应用程序中包含了设计,这就是为什么 get 请求工作正常,csrf 令牌在我的表单和视图中工作正常(我使用 simple_forms gem 生成)但是由于单元测试没有通过浏览器,因此缺少令牌并且测试失败。我需要一种方法来传递令牌或在测试时排除检查。
    • 你可以把它放在 application_controller.rb 中:skip_before_filter :verify_authenticity_token if Rails.env.test?
    • 我实际上只是想我可以将测试环境配置为不config.action_controller.allow_forgery_protection = false,这更好,一旦这样做,我不会再收到 CSRF 警告,但我仍然会收到Completed 401 Unauthorized,所以我猜问题不在 CSRF 中……我又一头雾水了。
    • 实际上我纠正了自己,似乎从测试环境中禁用 CRSF 有效。一些以前不工作的电话现在工作了,而其他电话现在我有不同的问题.. 感谢您的支持。
    【解决方案2】:

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

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

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

    【讨论】:

    猜你喜欢
    • 2012-03-20
    • 2014-08-20
    • 2016-02-08
    • 2018-12-23
    • 2018-06-09
    • 2017-03-08
    • 2012-05-11
    • 2013-08-01
    • 1970-01-01
    相关资源
    最近更新 更多