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
しかし、それは間違いなく答えではありません:)。