如何编写需要OAuth2访问令牌的RSpec测试?

时间:2016-07-08 16:38:10

标签: ruby-on-rails testing rspec oauth doorkeeper

我正在为一个部分受OAuth2保护的Rails API编写RSpec测试。我需要编写诸如

之类的测试
  • GET ResourcesController#index
    • 提供access_token
      • 显示资源列表
    • 未提供access_token
      • 不返回任何内容

和那样的东西。我以为我可以使用oauth2 gem,但我很快就意识到这可以通过向Rails应用程序发出实际的HTTP请求来实现。我有点失落,有人能指出我正确的方向吗?

编辑更多信息

我正在使用Doorkeeper来实施OAuth2。我的问题与我的控制器的某些方法隐藏在以下内容之后的事实有关:

before_action :doorkeeper_authorize!, only: [:update, :destroy]

验证身份验证令牌的存在和有效性。现在,这些令牌必须存在于数据库中。我的问题是我如何,

  • 将这些令牌放入数据库(也就是说,如何在RSpec测试中模拟正确的登录),或
  • 欺骗门卫(通过存根?)认为这些令牌存在且有效吗?

编辑2

找到this。在我读完这篇文章时,请随意添加答案。

1 个答案:

答案 0 :(得分:1)

你仍然可以使用oauth2 gem,它有许多在its own test suite中存根访问令牌的例子。如果没有一个特别尖锐的问题,你可能会提出更多的建议。

或者,有vcr gem记录http交互并在测试期间播放它们。您可以录制实时API交互,然后使用播放来运行测试。

<强>更新

在您提到门卫并自己找到其文档之后,这是same source中的一个示例。

describe Api::V1::ProfilesController do
  describe 'GET #index' do
    let(:token) { double :acceptable? => true }

    before do
      controller.stub(:doorkeeper_token) { token }
      # allow(controller).to receive(:doorkeeper_token) {token} # => RSpec 3
    end

    it 'responds with 200' do
      get :index, :format => :json
      response.status.should eq(200)
    end
  end
end
  

Stubbing:可以接受吗? =&GT; true将绕过门卫过滤器,因为令牌有效。如果您希望返回false,则响应状态将为401未授权。