Вот моя маленькая проблема, которая заставляет меня чувствовать себя глупо. Я тестирую свое приложение 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
- Рельсы 3.1.0
- ruby 1.9.3p0 (редакция 2011-10-30 33570)
- 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)>'