4

Grape API を使用した Rails アプリがあります。

インターフェイスは Backbone で行われ、Grape API がすべてのデータを提供します。

返されるのはユーザー固有のものだけなので、現在ログインしているユーザーへの参照が必要です。

簡略版は次のようになります。

API の初期化:

module MyAPI
  class API < Grape::API
    format :json

    helpers MyAPI::APIHelpers

    mount MyAPI::Endpoints::Notes
  end
end

終点:

module MyAPI
  module Endpoints
    class Notes < Grape::API
      before do
        authenticate!
      end

      # (...) Api methods
    end
  end
end

API ヘルパー:

module MyAPI::APIHelpers
  # @return [User]
  def current_user
    env['warden'].user
  end

  def authenticate!
    unless current_user
      error!('401 Unauthorized', 401)
    end
  end
end

ご覧のとおり、Warden から現在のユーザーを取得すると、正常に動作します。しかし、問題はテストにあります。

describe MyAPI::Endpoints::Notes do
  describe 'GET /notes' do
    it 'it renders all notes when no keyword is given' do
      Note.expects(:all).returns(@notes)
      get '/notes'
      it_presents(@notes)
    end
  end
end

ヘルパーのメソッド *current_user* を特定のユーザーでスタブするにはどうすればよいですか?

私は試した:

  • env/request を設定していますが、 getメソッドを呼び出す前には存在しません。
  • MyAPI::APIHelpers#current_user メソッドを Mocha でスタブ化する
  • MyAPI::Endpoints::Notes.any_instance.stub を Mocha でスタブ化する

編集:現時点では、次のようにスタブ化されています:

仕様:

  # (...)
  before :all do
    load 'patches/api_helpers'
    @user = STUBBED_USER
  end
  # (...)

仕様/パッチ/api_helpers.rb:

STUBBED_USER = FactoryGirl.create(:user)
module MyAPI::APIHelpers
  def current_user
    STUBBED_USER
  end
end

しかし、それは間違いなく答えではありません:)。

4

2 に答える 2