2014-01-08 99 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,这两种情况都取得了成功。