Тестирование (RSpec) с помощью модуля подтверждения
Я понимаю, что среда тестирования Rails срывается и перестраивается перед каждым тестом... так как я могу протестировать контроллер, который требует, чтобы пользователь вошел в систему, и этот пользователь не может быть создан без подтверждения модуля в пути?
Devise рекомендуемый метод (ниже) создает нового пользователя, который затем отправляет электронное письмо с помощью модуля Devise confirmable
. Как мне обойти это, чтобы я не "создавал" пользователя каждый раз... или, если я есть, я могу получить объект для тестирования w/out "имитируя" новое письмо для каждой спецификации?
before(:each) do
@user = Factory.create(:user)
sign_in @user
end
Я уверен, что я упускаю из виду что-то болезненное, так как это должно быть очень распространенная спецификация для всех, кто использует Devise с подтверждением...
Ответы
Ответ 1
В тестовой среде ActionMailer::Base.delivery_method
должно быть установлено значение :test
, что означает, что эти письма не будут отправлены. Если этот параметр установлен на что-то еще, например smtp
, используя конфигурацию в say config/environments.rb
, тогда электронные письма будут отправлены.
Если этот параметр уже существует, то для использования объекта User
(как и для входа в систему) вам нужно вызвать confirm!
на нем:
user = User.first
user.confirm!
Ответ 2
для последней версии FactoryGirl:
FactoryGirl.define do
factory :confirmed_user, :parent => :user do
after(:create) { |user| user.confirm! }
end
end
Ответ 3
Если вы используете factory_girl для генерации ваших моделей, вы можете использовать after_create
для подтверждения каждого нового пользователя.
Factory.define :confirmed_user, :parent => :user do |f|
f.after_create { |user| user.confirm! }
end
Ответ 4
Сегодня он просто помещается:
confirm_at 7.days.ago
при изготовлении
Ответ 5
Попробуйте выполнить stubbing active?
@user = Factory.create(:user)
@user.stub(:active?).and_return(true)
sign_in @user
Вам также может понадобиться заглушить confirmed?
, я не слишком хорошо знаком с Devise.
Ответ 6
Для Devise 4.2 теперь confirm
(не confirm!
).
Источник
4.2.0 - 2016-07-01
Удалите Devise:: Models:: Confirmable # confirm! метод, используйте вместо этого подтверждение.
Код ниже также предотвращает создание почтовых сообщений благодаря after(:build)
vs after(:create)
для установки confirmed_at
FactoryGirl.define do
factory :user do
after(:build) { |u| u.skip_confirmation_notification! }
after(:create) { |u| u.confirm }
...
end
end
Ответ 7
Для драгоценных камней изготовления
Fabricator(:user) do
after_build { |user| user.confirm! }
end