Тестирование (RSpec) с подтверждающим модулем Devise - PullRequest
28 голосов
/ 14 декабря 2010

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

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

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

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

Ответы [ 7 ]

34 голосов
/ 14 декабря 2010

В вашей тестовой среде ActionMailer::Base.delivery_method должно быть установлено на :test, что означает, что эти электронные письма не будут отправляться. Если для этого параметра установлено другое значение, например smtp, например, в конфигурации, например, config/environments.rb, то электронные письма будут отправляться.

Если этот параметр уже существует, то для использования объекта User (например, чтобы иметь возможность войти в систему) вам нужно вызвать confirm! для него:

user = User.first
user.confirm!
17 голосов
/ 09 ноября 2012

для последней версии FactoryGirl:

FactoryGirl.define do

  factory :confirmed_user, :parent => :user do
    after(:create) { |user| user.confirm! }
  end

end
13 голосов
/ 22 января 2011

Если вы используете factory_girl для генерации ваших моделей, вы можете использовать after_create для подтверждения каждого нового пользователя.

Factory.define :confirmed_user, :parent => :user do |f|
  f.after_create { |user| user.confirm! }
end
6 голосов
/ 05 апреля 2014

Сегодня это просто положить:

подтверждается_день 7.days.ago

на ваше изготовление

5 голосов
/ 24 декабря 2016

Для Devise 4.2 теперь confirm (не confirm!).

Источник

4.2.0 - 2016-07-01

Удалить Devise :: Models :: Confirmable # подтвердить! метод, используйте вместо этого подтверждение.

Код ниже также предотвращает создание почтовых программ благодаря after(:build) против after(:create) за настройку confirmed_at

FactoryGirl.define do
  factory :user do
    after(:build)   { |u| u.skip_confirmation_notification! }
    after(:create)  { |u| u.confirm }
    ...
  end
end
2 голосов
/ 14 декабря 2010

Попробуйте заглушить active?

@user = Factory.create(:user)
@user.stub(:active?).and_return(true)
sign_in @user

Вам также может понадобиться заглушить confirmed?, я не слишком знаком с Devise.

1 голос
/ 03 августа 2011

Для изготовления драгоценного камня это

Fabricator(:user) do
  after_build { |user| user.confirm! }
end
...