2014-01-08 103 views
2

如果您已成功測試發佈,放置和刪除受到doorkeeper OAuth2提供程序gem保護的Rails API的http方法,請分享,我會給你愛。rspec在rails api上測試紅寶石保護與門衛

doorkeeper wiki documentationsample application很好地展示瞭如何測試get方法。我成功地測試了一個類似於使用Capybara測試驅動程序和Cucumber的文章。無法測試從put或delete路由的任何API。無法使用rspec測試進行發佈。

@user = create :user 
@client = create(:oauth_application) 
@token = create(:oauth_token, :application => @client, :resource_owner_id => @user) 
json_for_new_entry = { 
    date_attr: Time.now.to_date, 
    decimal_attr: '1.1', 
    string_attr: 'oath2, you make me blue', 
    bool_attr: false, 
    int_attr: 1 
}.to_json 
page.driver.header 'Authorization', "Bearer #{@token.token}" 
page.driver.post api_entry_path, json_for_new_entry, 
    'CONTENT_TYPE' => 'application/json' 

的工廠都沒有什麼特別的:

factory :user, :class => User do |user| 
    sequence :email do |n| "user#{n}@example.com" end 
    pwd = "password" 
    password pwd 
end 

factory :oauth_application, :class => Doorkeeper::Application do 
    sequence(:name) { |n| "application_name_#{n}" } 
    #redirect_uri 'urn:ietf:wg:oauth:2.0:oob' 
    redirect_uri 'http://localhost:3000/' 
end 

factory :oauth_token, :class => Doorkeeper::AccessToken do 
    association :application, :factory => :oauth_application 
    association :resource_owner_id, :factory => :user 
end 

我的環境是有點落後了最新版本:

  • 在3.1.12
  • 水豚2.2.0
  • 軌寶石
  • 黃瓜1.3.10
  • 設計2.2.7
  • 區長1.2.3
  • 看門0.7.4
  • rspec的核2.14.5
  • rspec的-期望2.14.3
  • rspec的-嘲笑2.14.3
  • rspec的-rails 2.14.0

回答

3

假設測試的目的是爲了驗證底層API的功能,而不是看門的保護,那麼這是黑客使用:

在我的基本控制器:

module Api 
    class BaseController < ActionController::Base 

    doorkeeper_for :all unless Rails.env.test? 

    private 

     def current_user 
     if Rails.env.test? && $test_user 
      $test_user 
     else 
      @current_user ||= User.find(doorkeeper_token.resource_owner_id) 
     end 

     end 

    end 
end 

在我的測試中,我有一個登錄助手:

def login(user) 
    $test_user = user 
end 

def logout 
    $test_user = nil 
end 

我不是代碼的驕傲,但仍然我現在可以用我的生命得到代替擔心在測試過程中如何使鐵軌/門衛/ capybara等人一起工作。

+2

謝謝。它會起作用,但我並不是瘋狂地在生產代碼中加入特殊情況來測試它。我希望得到的答案將是獨立於應用程序的測試代碼。 Upvote,因爲它會解決問題並進行測試。謝謝你的答案。 –

2

您可以使用包含在doorkeeper wiki的例子如下

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 
+0

您是否驗證過這將啓用POST,DELETE,PUT,PATCH操作?我並不是說它不會;但是,在閱讀我原來的問題之後,我感受到了這一點,並且無法將它擴展到其他HTTP動詞。 –

+0

其實我沒有,我只用get來測試它,我會測試它並回到這裏,因爲這是我現在正在處理的任務:D –

1

我用穆斯塔法給了答案,但我想擦乾,所以我把下列spec/support/doorkeeper_oauth.rb

shared_context "doorkeeper_oauth", oauth: true do 
    let(:dummy_token) { double(:acceptable? => true) } 
    before do 
    if controller.present? 
     allow(controller).to receive(:doorkeeper_token) { dummy_token } 
    end 
end 

然後,在您的控制器規格中稍微更改開局線:

describe Api::V2::WidgetsController, oauth: true do 

,它通過「元數據」方法引入共享上下文。

編輯:我至少使用過GET和POST,這兩種情況都取得了成功。