使用rspec_api_documentation挖出Doorkeep Token

时间:2013-10-24 22:19:32

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

我正在使用rspec_api_documentation在Rails 4中构建API,并且给我留下了非常深刻的印象。选择使用DoorKeeper来保护我的端点,我已经成功地从控制台测试了这一切,并使其正常工作。

现在我遇到困难的是如何规范它,并存根令牌。

DoorKeeper的文档建议使用以下内容:

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

    before do
      controller.stub(:doorkeeper_token) { token }
    end

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

但是,我已根据rspec_api_documentation编写了验收测试。这是我写的projects_spec.rb

require 'spec_helper'
require 'rspec_api_documentation/dsl'

resource "Projects" do
  header "Accept", "application/json"
  header "Content-Type", "application/json"

  let(:token) { stub :accessible? => true }

  before do
    controller.stub(:doorkeeper_token) { token }
  end

  get "/api/v1/group_runs" do
    parameter :page, "Current page of projects"

    example_request "Getting a list of projects" do
      status.should == 200
    end
  end
end

当我运行测试时,我得到以下内容:

undefined local variable or method `controller' for #<RSpec::Core

我怀疑这是因为它不是明确的控制器规范,但正如我所说,我宁愿坚持使用这种测试我的API的rspec_api_documentation方式。

当然有人不得不这样做?还有另一种方法可以存根令牌吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

我不建议在rspec_api_documentation验收测试中删除DoorKeeper。 RAD的一个好处是可以看到它生成的示例中的所有标题。如果您正在删除OAuth2,那么阅读文档的人在尝试创建客户端时将看不到任何OAuth2标头。

我也不确定这样做是否可行。 RAD与Capybara功能测试非常相似,快速search使得它看起来很难。

RAD有一个OAuth2MacClient您可以使用here

require 'spec_helper'

resource "Projects" do
  let(:client) { RspecApiDocumentation::OAuth2MACClient.new(self) }

  get "/api/v1/group_runs" do
    example_request "Getting a list of projects" do
      status.should == 200
    end
  end
end

答案 1 :(得分:2)

我遇到了同样的问题,我手动创建了带有指定令牌的访问令牌。通过这样做,我可以在Authorization标头中使用我定义的标记:

resource "Projects" do
  let(:oauth_app) { 
    Doorkeeper::Application.create!(
      name: "My Application", 
      redirect_uri: "urn:ietf:wg:oauth:2.0:oob" 
    ) 
  }
  let(:access_token)  { Doorkeeper::AccessToken.create!(application: oauth_app) }
  let(:authorization) { "Bearer #{access_token.token}" }

  header 'Authorization', :authorization

  get "/api/v1/group_runs" do
    example_request "Getting a list of projects" do
      status.should == 200
    end
  end
end