2010-12-13 13 views
27

È a mia conoscenza che l'ambiente di test di Rails viene rimosso e ricostruito prima di ogni test ... quindi come faccio a testare un controller che richiede che un utente sia connesso e che l'utente possa? essere creato senza che il modulo confermabile di Device interferisca?Test (RSpec) con modulo confermabile di Devise

Devise's recommended method (sotto) crea un nuovo utente che viene quindi inviato tramite e-mail dal modulo confirmable di Devise. Come faccio ad aggirare questo, quindi non sto 'creando' un utente ogni volta ... o se sono in grado di ottenere un oggetto da testare senza "simulare" una nuova email per ogni specifica?

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

sono sicuro che sto affaccia qualcosa di dolorosamente ovvio come questo deve essere una specifica molto comune per chiunque utilizzi Devise con confermabile ...

risposta

32

Nel vostro ambiente di test ActionMailer::Base.delivery_method dovrebbe essere impostato a :test, il che significa che queste e-mail non verranno inviate. Se questa impostazione è impostata su qualcos'altro come smtp tramite una configurazione, ad esempio config/environments.rb, le e-mail saranno inviate.

Se tale impostazione è già lì, quindi utilizzare l'oggetto User (come nel caso, per essere effettivamente in grado di log in) è necessario chiamare confirm! su di esso:

user = User.first 
user.confirm! 
+0

si potrebbe anche spostare la creazione del l'utente ad una 'prima (: all) 'blocca, per velocizzarlo ... – iain

+0

Ho dovuto aggiungere' config.action_mailer.default_url_options = {: host => 'localhost: 3000'} 'per ottenere test da eseguire ... altrimenti' test.rb' è la caldaia piatto, per quanto ne so.Solo le configurazioni relative alla posta in 'test.rb' o' environment.rb' sono: 'config.action_mailer.delivery_method =: test'. – Meltemi

+1

quindi 'ActionMailer :: Base.delivery_method =: test' è diverso in qualche modo rispetto all'auto-generato' config.action_mailer.delivery_method =: test' ?? – Meltemi

2

Prova spegnendo active?

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

Potrebbe anche essere necessario eseguire lo stub confirmed?, Non ho molta familiarità con Devise.

12

Se si utilizza factory_girl per generare i propri modelli, è possibile utilizzare after_create per confermare ogni nuovo utente.

Factory.define :confirmed_user, :parent => :user do |f| 
    f.after_create { |user| user.confirm! } 
end 
+4

Credo che otterrete lo stesso effetto aggiungendo' confirmed_at Time.now' come attributo factory. – Giuseppe

1

Per la realizzazione gioiello che è

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

Non richiederebbe 'after_create', non' after_build'? – slothbear

+0

sì, dovrebbe essere after_create – Ricbermo

17

per la versione più recente factorygirl:

FactoryGirl.define do 

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

end 
5

Oggi è appena messo:

confirmed_at 7.days.ago

sul tuo fabr ication

2

Per Devise 4.2 è ora confirm (non confirm!).

Source

4.2.0 - 2016-07-01

Remove the Devise::Models::Confirmable#confirm! method, use confirm instead.

codice qui sotto impedisce anche mailer di essere generato grazie alla after(:build) vs after(:create) per l'impostazione confirmed_at

FactoryGirl.define do 
    factory :user do 
    after(:build) { |u| u.skip_confirmation_notification! } 
    after(:create) { |u| u.confirm } 
    ... 
    end 
end 
Problemi correlati