我有使用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 *?
我试过了:
编辑: 目前,它以这种方式存在:
规格:
# (...)
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
但这绝对不是答案:)。
答案 0 :(得分:2)
https://github.com/intridea/grape/blob/master/spec/grape/endpoint_spec.rb#L475 (如果由于更改,代码不在同一行,只需执行ctrl + f&amp;寻找助手)
以下是来自同一档案的一些代码
it 'resets all instance variables (except block) between calls' do
subject.helpers do
def memoized
@memoized ||= params[:howdy]
end
end
subject.get('/hello') do
memoized
end
get '/hello?howdy=hey'
last_response.body.should == 'hey'
get '/hello?howdy=yo'
last_response.body.should == 'yo'
end