2012-01-12 4 views
0

Вот моя маленькая проблема, которая заставляет меня чувствовать себя глупо. Я тестирую мое приложение рельсы с RSpec и я также разработать вспомогательный контроллер (захваченный из вики завещать, обратите внимание пользователя параметр по умолчанию):Неверное количество аргументов при вызове метода в разных контекстах RSpec

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. Рельсы 3.1.0
  2. рубинового 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)>' 
+0

Вы используете RSpec 2.8.0? – Bangline

+0

Можете ли вы опубликовать полное сообщение об ошибке, пожалуйста? – d11wtq

+0

Из разработки wiki - «На момент написания ни одной версии gs-версии rspec-mocks не поддерживаются параметры throw, поэтому вам нужно будет использовать репозиторий git (вместе с rspec и rspec-rails 2.8.0. rc1) «. RSpec 2.8.0 был выпущен на днях – Bangline

ответ

2

ошибка будет приходить от линии

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 

Таким образом, вы обходя Придумайте вообще, который хорошо испытанный

+0

Большое спасибо, обновление rspec до 2.8.1 решило проблему. –

+0

Хороший! Рад помочь – Bangline

Смежные вопросы