Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在rspec-rails请求测试中发布丢失的真实性令牌?_Ruby On Rails_Rspec_Csrf_Authenticity Token - Fatal编程技术网

Ruby on rails 如何在rspec-rails请求测试中发布丢失的真实性令牌?

Ruby on rails 如何在rspec-rails请求测试中发布丢失的真实性令牌?,ruby-on-rails,rspec,csrf,authenticity-token,Ruby On Rails,Rspec,Csrf,Authenticity Token,我正在模拟来自外部服务的请求,该服务将没有真实性令牌。如果在\u操作之前跳过\u:验证\u真实性\u令牌丢失,我希望测试失败 如何从Rspec请求规范中执行此操作 目前我正在使用post,如下所示,但它被愉快地接受了 post endpoint, my_json_string, {'CONTENT_TYPE' => "application/json"} CSRF保护。尝试使用以下方法启用它: before do ActionController::Base.allow_forger

我正在模拟来自外部服务的请求,该服务将没有真实性令牌。如果
在\u操作之前跳过\u:验证\u真实性\u令牌
丢失,我希望测试失败

如何从Rspec请求规范中执行此操作

目前我正在使用
post
,如下所示,但它被愉快地接受了

post endpoint, my_json_string, {'CONTENT_TYPE' => "application/json"}
CSRF保护。尝试使用以下方法启用它:

before do
  ActionController::Base.allow_forgery_protection = true
end

after do
  ActionController::Base.allow_forgery_protection = false
end

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

然后,我可以在不禁用伪造保护的情况下测试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

对于Rails 4.2.5.1和Rspec 3.4,此技术工作良好。我怀疑这是实现解决方案的正确方法。对于CSRF保护的测试,可能需要:
expect{post endpoint,my_json_string}。若要引发_错误(ActionController::InvalidAuthenticityToken)
。我想我应该检查回复的返回码。另外,行号在master branch上不再有效。使用这样的标签怎么样?@FranklinYu:更新了链接。很好的建议。即使是现在的Rails5(API)也是不错的解决方案。