测试未登录用户的发布请求的行为

时间:2015-03-25 03:22:39

标签: ruby-on-rails ruby-on-rails-4 rspec rspec-rails

我正在开展一个用户登录和退出的项目,我知道这完全令人震惊,我们确保人们可以在完成后退出。我们注意到的一件事是,由于各种原因,当系统已将其注销时,用户可以尝试单击注销按钮。 (会话超时,从其他浏览器登录或其他原因。该站点仅允许每个用户进行一次并发登录。)

因此,当用户尝试POST到注销URL时会发生什么,因为他们没有有效的会话,因此他们无法通过CSRF验证。出于安全考虑,我们无法删除CSRF验证。

因此,我正在尝试添加一个允许我测试此行为的测试,以便不会炸毁无效的CSRF令牌,它会默默地接受用户已经注销并继续其业务

我所尝试的基本上是这样的:

context 'user is not logged in' do
  before do
    Rails.application.config.action_controller.allow_forgery_protection = true
  end

  it 'does not blow up' do
    expect { post :destroy, {}, { some_key: 'val' } }.not_to raise_error
  end

  it 'redirects to logout path' do
    expect(response).to redirect_to(successful_logout_path)
  end
end

尽管我的控制器没有任何逻辑更改,但仍然是绿色的,并且手动测试确认它仍然无法正常工作。

有关如何为此上下文启用CSRF验证的任何建议,或在单元测试中测试此方法的其他方法?

1 个答案:

答案 0 :(得分:0)

Devise在去年之前遇到了类似的问题。我在这里向Github提交了一个问题:https://github.com/plataformatec/devise/issues/2934并且最终修复了。这个问题可以帮到你:InvalidAuthenticityToken in Devise::SessionsController#destroy (sign out after already having signed out)