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! то все мои тесты проходят.
Помогает ли кто-нибудь?
Ответы
Ответ 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
будет терпеть неудачу, и все последующие спецификации будут действовать так, как будто вы не вошли в систему.
Ответ 3
Я не знаю, что вызвало это, но для меня решение заключалось в том, чтобы добавить метод:
def valid_session
{"warden.user.user.key" => session["warden.user.user.key"]}
end
Найдено здесь:
rail3/rspec/devise: тест контроллера rspec завершился неудачно, если я не добавлю dummy = subject.current_user.inspect