Неверное количество аргументов при вызове метода в разных контекстах RSpec - PullRequest
0 голосов
/ 12 января 2012

Вот моя маленькая проблема, которая заставляет меня чувствовать себя глупо. Я тестирую свое приложение rails с помощью RSpec, и у меня также есть помощник контроллера devise (взят из вики Devise, обратите внимание user параметр по умолчанию):

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

И это довольно смущает меня, потому что я передаю только один (ноль) аргумент. Я буду рад услышать любые предложения, потому что эти два звонка выглядят одинаково для меня. Может быть, я что-то упустил.

UPDATE

  1. Рельсы 3.1.0
  2. ruby ​​1.9.3p0 (редакция 2011-10-30 33570)
  3. RSpec 2.7.1

ОБНОВЛЕНИЕ 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 Ответ

2 голосов
/ 12 января 2012

Ошибка будет поступать со строки

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

Версии RSpec ниже 2.8 не поддерживают параметры для and_throw. Обновите Gemfile, чтобы использовать RSpec 2.8.0, и дайте мне знать, как вы попали.

Я помню, я использовал более простой метод для проверки контроллера

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

Таким образом, вы вообще обходите Devise, что хорошо проверено

...