Подтвердить что ты не робот

RSpec и разработка: невозможно sign_in admin

Я переношу свои стандартные тесты Rails на RSpec, и у меня проблемы с разработкой. Все контроллеры, содержащие проверку подлинности, не работают с RSpec.

Я пытаюсь выполнить sign_in администратора в RSpec после учебника по разработке без успеха:

https://github.com/plataformatec/devise/wiki/How-To:-Controllers-and-Views-tests-with-Rails-3-(and-rspec)

Вот что я пробовал:

/spec/controllers/ipad_tech_infos_controller_spec.rb

before :each do
    @request.env["devise.mapping"] = Devise.mappings[:admin]
    @admin = FactoryGirl.create :admin
    sign_in @admin
end

/spec/support/devise.rb

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

/spec/factories/admin.rb

FactoryGirl.define do
  factory :admin do
    email "[email protected]"
    password "foobar"
    password_confirmation {|u| u.password}
  end
end

Моя модель не поддается подтверждению, вся моя спецификация контроллера не работает.

Если я удалю before_filter: authenticate_admin! то все мои тесты проходят.

Помогает ли кто-нибудь?

4b9b3361

Ответ 1

Вероятный виновник: Убедитесь, что вы не устанавливаете сеанс явно в настройках вашего контроллера.

Например, если вы используете генератор эстакад Rspec по умолчанию, сгенерированные спецификации контроллера передают параметры сеанса.

get :index, {}, valid_session

Они переписывают переменные сеанса, которые устанавливают помощники, чтобы войти в систему с Warden. Самое простое решение - удалить их:

get :index, {}

В качестве альтернативы вы можете установить в них информацию о сеансе Warden, вместо использования помощников Devise.

Ответ 2

Вы сказали: "Моя модель не поддается подтверждению", поэтому следующее не относится к вам, но здесь есть тонкость, которую другие могут пропустить, например, я сделал (и потратил впустую час).

Обратите внимание на инструкцию RSpec/Devise How-To, о которой упоминается выше, говорится, что если у вас есть модуль "Подтверждающий" Devise, который включен в вашей модели, то вам нужно позвонить @admin.confirm! прямо перед sign_in @admin или иначе убедитесь, что ваш factory устанавливает confirmed_at, когда он создает ваш @admin. Если вы этого не сделаете, вызов sign_in будет терпеть неудачу, и все последующие спецификации будут действовать так, как будто вы не вошли в систему.