如何在 rspec rails 请求测试中发布缺少authentity_token 的帖子?

Posted

技术标签:

【中文标题】如何在 rspec rails 请求测试中发布缺少authentity_token 的帖子?【英文标题】:How to POST with missing authenticity_token in rspec rails request test? 【发布时间】:2015-05-10 22:02:17 【问题描述】:

我正在模拟来自外部服务的请求,该服务没有真实性令牌。如果skip_before_action :verify_authenticity_token 丢失,我希望测试失败。

如何根据 Rspec 请求规范执行此操作?

目前我正在使用post,如下所示,但很高兴接受。

post endpoint, my_json_string, 'CONTENT_TYPE' => "application/json"

【问题讨论】:

【参考方案1】:

CSRF 保护disabled in test environment。尝试启用它使用:

before do
  ActionController::Base.allow_forgery_protection = true
end

after do
  ActionController::Base.allow_forgery_protection = false
end

【讨论】:

从 Rails 4.2.5.1 和 Rspec 3.4 开始,这种技术可以正常工作。我怀疑这是实施解决方案的正确方法。 CSRF保护测试,可能需要the raise_error matcher:expect post endpoint, my_json_string .to raise_error(ActionController::InvalidAuthenticityToken)。我以为我应该检查响应的返回码。 另外,行号在master分支上不再有效。使用this 之类的标签怎么样? @FranklinYu:更新了链接。好建议。 现在的 Rails 5 (API) 也是不错的解决方案。【参考方案2】:

禁用 CSRF 保护对我不起作用。所以我创建了这个模块,它使用响应体来检索真实性令牌:

https://gist.github.com/Rodrigora/440220a2e24bd42b7b0c

然后,我可以在不禁用伪造保护的情况下测试 put/post 请求:

before do
  @token = login(create(:user, password: 'password'))
end

it 'tests model creation' do
   expect 
     post_with_token 'path/to/model', model_params, @token
   .to change(Model, :count).by(1)
end

【讨论】:

以上是关于如何在 rspec rails 请求测试中发布缺少authentity_token 的帖子?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 rspec 测试 Cloudinary rails 和 Attachinary?

RSpec 测试失败 - 使用显示套接字但缺少锁定文件

Rails/Rspec:测试延迟作业邮件

如何在 Rails/RSpec 中测试异常引发?

使用 Rspec 测试 Rails 3.1 可安装引擎

如何使用 RSpec 在 Rails 中测试:包含验证