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

Тестирование (RSpec) с помощью модуля подтверждения

Я понимаю, что среда тестирования Rails срывается и перестраивается перед каждым тестом... так как я могу протестировать контроллер, который требует, чтобы пользователь вошел в систему, и этот пользователь не может быть создан без подтверждения модуля в пути?

Devise рекомендуемый метод (ниже) создает нового пользователя, который затем отправляет электронное письмо с помощью модуля Devise confirmable. Как мне обойти это, чтобы я не "создавал" пользователя каждый раз... или, если я есть, я могу получить объект для тестирования w/out "имитируя" новое письмо для каждой спецификации?

 before(:each) do
    @user = Factory.create(:user)
    sign_in @user
  end

Я уверен, что я упускаю из виду что-то болезненное, так как это должно быть очень распространенная спецификация для всех, кто использует Devise с подтверждением...

4b9b3361

Ответ 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