RSpec и разработка: не могу войти в админ - PullRequest
17 голосов
/ 06 марта 2012

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

Я пытаюсь подписать_админа в RSpec, следуя учебному пособию, но безуспешно:

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

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

/ спецификации / контроллеры / ipad_tech_infos_controller_spec.rb

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

/ Спецификация / поддержка / devise.rb

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

/ спецификации / фабрики / admin.rb

FactoryGirl.define do
  factory :admin do
    email "abc@abc.com"
    password "foobar"
    password_confirmation {|u| u.password}
  end
end

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

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

Кто-нибудь может помочь?

Ответы [ 3 ]

21 голосов
/ 12 марта 2012

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

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

get :index, {}, valid_session

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

get :index, {}

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

3 голосов
/ 13 марта 2013

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

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

1 голос
/ 11 октября 2013

Я не знаю, что вызвало это, но для меня решение было добавить метод:

def valid_session
  {"warden.user.user.key" => session["warden.user.user.key"]}
end

Найдено здесь: rail3 / rspec / devise: проверка контроллера rspec не будет выполнена, если я не добавлю фиктивный = subject.current_user.inspect

...