Reputation: 38359
It's my understanding that Rails' testing environment is torn down and rebuilt before each test...so how do I test a controller that requires that a user be logged in and that user can't be created without Device's confirmable module getting in the way?
Devise's recommended method (below) creates a new user which is then sent an email by Devise's confirmable
module. How do I get around this so I'm not 'creating' a user each time...or if I am I can get an object to test w/out "simulating" a new email for each spec?
before(:each) do
@user = Factory.create(:user)
sign_in @user
end
I'm sure I'm overlooking something painfully obvious as this must be a very common spec for anyone using Devise with confirmable...
Upvotes: 33
Views: 13680
Reputation: 401
for latest FactoryGirl version:
FactoryGirl.define do
factory :confirmed_user, :parent => :user do
after(:create) { |user| user.confirm }
end
end
Upvotes: 18
Reputation: 384
This thread hasn't seen much traffic in a while, but for people who have this question now, all you need to do is create a trait called :confirmed
that sets the required attributes, and when you use it to create a user, you will be able to log in with it without requiring multiple saves of the user db records.
# Use faker library (installed separately) to set realistic seed data
require 'faker'
# Factory definition
factory :user, do
email { Faker::Internet.unique.email }
password { Faker::Internet.password(min_length: 12, max_length: 128) }
trait :confirmed do
confirmed_at { Time.zone.now }
confirmation_sent_at { Time.zone.now }
confirmation_token { '12345' }
end
end
# Example of using it
user = create(:user, :confirmed)
Upvotes: 2
Reputation: 523
For Devise 4.2 it's now confirm
(not confirm!
).
4.2.0 - 2016-07-01
Remove the Devise::Models::Confirmable#confirm! method, use confirm instead.
Code below also prevents mailers from being generated thanks to after(:build)
vs after(:create)
for setting confirmed_at
FactoryGirl.define do
factory :user do
after(:build) { |u| u.skip_confirmation_notification! }
after(:create) { |u| u.confirm }
...
end
end
Upvotes: 11
Reputation: 2891
For fabrication gem it is
Fabricator(:user) do
after_build { |user| user.confirm! }
end
Upvotes: 1
Reputation: 7934
If you are using factory_girl to generate your models, you can use after_create
to confirm each new user.
Factory.define :confirmed_user, :parent => :user do |f|
f.after_create { |user| user.confirm! }
end
Upvotes: 13
Reputation: 47578
Try stubbing active?
@user = Factory.create(:user)
@user.stub(:active?).and_return(true)
sign_in @user
You might also need to stub confirmed?
, I'm not too familiar with Devise.
Upvotes: 2
Reputation: 107728
In your test environment ActionMailer::Base.delivery_method
should be set to :test
, which means that these emails will not be sent out. If this setting is set to something else such as smtp
by way of a configuration in say config/environments.rb
, then emails will be sent out.
If that setting's already there, then to use the User
object (as in, to be actually able to log in) you'll need to call confirm!
on it:
user = User.first
user.confirm!
Upvotes: 37