ruby-on-rails – Stubbing Grape helper

我有使用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
点赞