在不同的RSpec上下文中调用方法时参数的数量错误

时间:2012-01-12 10:42:15

标签: ruby-on-rails ruby rspec devise

这是我的小问题让我感到愚蠢。我正在用RSpec测试我的rails应用程序,我也设计了控制器助手(从Devise wiki中获取,注意用户默认参数):

module ControllerMacros
  module ControllerHelpers
    def sign_in(user=mock_model(User))
      if user.nil?
        request.env['warden'].stub(:authenticate!).
          and_throw(:warden, {:scope => :user})
        controller.stub :current_user => nil
      else
        # Lots of user.stub here
        controller.stub :current_user => user
      end
    end
  end

  RSpec.configure do |config|
    config.include Devise::TestHelpers, :type => :controller
    config.include ControllerHelpers, :type => :controller
  end
end

现在,当我在控制器测试的一个上下文中使用 sign_in 时,一切正常:

context "Authorized access" do
    before(:each) do
      mocked_user = mock_model(User)
      mocked_user.stub(:is?).with(:admin).and_return(true)
      sign_in(mocked_user)
      # some checks 
    end
end

但是在另一个背景下(在相同的规范中)我得到“错误的参数数量(2对1)”:

context "Unauthorized access" do
 before(:each) do
   sign_in(nil)
 end

# test cases
end

这对我来说相当混乱,因为我只传递了一个(零)参数。我很高兴听到任何建议,因为这两个电话看起来对我来说都是一样的。也许我错过了什么。

更新

  1. Rails 3.1.0
  2. ruby​​ 1.9.3p0(2011-10-30修订版33570)
  3. RSpec 2.7.1
  4. 更新2(错误示例):

     Failure/Error: sign_in(nil)
       ArgumentError:
       wrong number of arguments (2 for 1)
       # ./spec/support/controller_macros.rb:5:in `sign_in'
       # ./spec/controllers/forum/topics_controller_spec.rb:93:in `block (3 levels) in <top (required)>'
    

1 个答案:

答案 0 :(得分:2)

错误将来自

request.env['warden'].stub(:authenticate!).and_throw(:warden, {:scope => :user})

低于2.8的RSpec版本不支持and_throw的参数。更新Gemfile以使用RSpec 2.8.0并告诉我你是如何继续的。

我记得我使用了一种更简单的控制器测试方法

before do
  controller.stub(:authenticate!).and_return(mock_model('user'))
end

这样你完全绕过了Devise,经过了充分的测试