我有使用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
如何将helper的方法* current_user *与某个特定用户一起存根?
我试过了:
>设置env / request,但在调用get方法之前它不存在.
>使用Mocha存根MyAPI :: APIHelpers#current_user方法
>使用Mocha存根MyAPI :: Endpoints :: Notes.any_instance.stub
编辑:
目前,它是这样的:
规格:
# (...)
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
但它绝对不是答案:).
最佳答案 这个
issue中提到的评论应该对你有所帮助,这就是Grape测试它的助手的方式,
https://github.com/intridea/grape/blob/master/spec/grape/endpoint_spec.rb#L475
(如果由于更改,代码不在同一行,只需执行ctrl f&寻找助手)
这是来自同一文件的一些代码
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