Stubbing Grape helper

时间:2013-05-11 15:12:42

标签: ruby-on-rails ruby devise mocha grape

我有使用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 方法之前它不存在。
  • 使用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

但这绝对不是答案:)。

1 个答案:

答案 0 :(得分:2)

这个issue中提到的评论可以帮到你,这就是Grape测试它的助手的方式,

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