ruby on rails -重写action_controller.Allow_forgery_protection用



我有一个rails3应用程序,在我的基础应用程序控制器中使用protect_from_forgery。我正在使用ActionDispatch::IntegrationTest,并希望确保在某些集成测试期间存在真实性令牌。

我不希望每个执行帖子的功能测试都必须传递authenticity_token,所以我的test.rb文件指定:

  config.action_controller.allow_forgery_protection    = false

按照rails文档的建议。

然而,对于集成测试,我希望确保我的表单正确发送真实性令牌。如果不改变config/environments/test.rb

中的全局设置,我找不到任何方法来做到这一点

如果我所有的表单都是用form_for生成的,我很乐意相信rails可以处理这个问题,但是我使用ExtJS,并且有许多ExtJS表单需要手动指定,所以我真的应该测试管道是否都在工作。

您可以简单地更改集成测试设置中的值:

require 'test_helper'
class MyCrunchyIntegrationTest < ActionController::IntegrationTest
  fixtures :all
  def setup
    ActionController::Base.allow_forgery_protection = true
  end
  def teardown
    ActionController::Base.allow_forgery_protection = false
  end
  test "how awesome my application is" do
    # ...
  end
end

为块临时启用伪造保护的辅助方法:

def with_forgery_protection
  orig = ActionController::Base.allow_forgery_protection
  begin
    ActionController::Base.allow_forgery_protection = true
    yield if block_given?
  ensure
    ActionController::Base.allow_forgery_protection = orig
  end
end
with_forgery_protection do
  # code in here will require csrf token
end

这是@gmcnaughton解决方案的RSpec版本。

spec_helper.rb:

RSpec.configure do |config|
  config.around(:each, :with_csrf_protection) do |example|
    orig = ActionController::Base.allow_forgery_protection
    begin
      ActionController::Base.allow_forgery_protection = true
      example.run
    ensure
      ActionController::Base.allow_forgery_protection = orig
    end
  end
end

然后像这样编写测试:

it "foo", with_csrf_protection: true do
  # …
end
或者,根据你的RSpec设置:
it "foo", :with_csrf_protection do
  # …
end

相关内容

  • 没有找到相关文章

最新更新