2012-06-09 9 views
21

Gli utenti appena registrati alla mia piccola app devono essere approvati dall'amministratore (io) prima che possano accedere al sito. Sono riuscito a generare email di questo tipo in fase di sviluppo con un after_create :send_admin_email nel mio modello utente che funziona alla grande. Il mio problema è che sto generando più utenti durante i miei test (usando FactoryGirl) e ogni utente di test creato invia una vera e-mail. Eseguire i miei test è come versare melassa a gennaio e devo eliminare centinaia di e-mail inviate alla mia casella di posta. Come lo spengo?ActionMailer invia email reali in modalità test! - Come spegnere?

Action Mailer Basics nello mi dice che "Per impostazione predefinita, Action Mailer non invia e-mail nell'ambiente di test. Sono appena stati aggiunti all'array ActionMailer :: Base.deliveries."

Inoltre, in config/environments/test.rb ho:

config.action_mailer.delivery_method = :test 

che è in aggiunta al config/environment.rb avere:

# Configuration for using SendGrid on Heroku 
ActionMailer::Base.smtp_settings = { 
    :address  => 'smtp.sendgrid.net', 
    :port   => '587', 
    :authentication => :plain, 
    :user_name  => 'app[my app number]@heroku.com', 
    :password  => '[something super secret]', 
    :domain   => '[let's get this party started!.com]', 
    :enable_starttls_auto => true 
} 
ActionMailer::Base.delivery_method = :smtp 

Sono sicuro che mi manca qualcosa di semplice e di base. Ho cercato in giro e le domande e i post correlati si occupano di come testare che ActionMailer abbia effettivamente inviato email.

Umile gratitudine in anticipo per qualsiasi pensiero o aiuto.

Addendum: in seguito a una risposta a una domanda simile trovata a Is it possible to turn off ActionMailer emails when cucumber testing is happening on development?, ho potuto interrompere l'invio di messaggi di follia. Tuttavia, ho dovuto aggiungere ActionMailer::Base.delivery_method = :test a diversi file rspec. C'è un modo per chiuderlo globalmente? Qualcuno ha qualche idea su cosa sta succedendo?

+0

Con tutte queste e-mail, ho superato il limite di 200/giorno consentito da Invia griglia. Ho trovato [Come scrivere funzioni che in realtà non usano Sendgrid?] (Https://groups.google.com/group/heroku/browse_thread/thread/7a4044f299ccf1fc/a0d687041fd97389?pli=1) che dice che 'ActionMailer :: Base.delivery_method =: smtp 'in' config/environment.rb' sta sovrascrivendo 'config.action_mailer.delivery_method =: test' in' config/environments/test.rb' Ho spostato 'ActionMailer :: Base.delivery_method =: smtp 'in 'config/environments/development.rb' e' config/environments/production.rb' che potrebbero funzionare. Aggiorneremo domani. – BenU

risposta

34

Quindi l'ho capito. Avere la riga ActionMailer::Base.delivery_method = :smtp in config/environment.rb ha la precedenza su ActionMailer::Base.delivery_method = :test in config/environments/test.rb.

Quindi, eliminare quella riga, ActionMailer::Base.delivery_method = :smtp' da config/environment.rb e posizionarla in config/environments/production.rb. Ciò consente di posizionare ActionMailer::Base.delivery_method = :test in config/environments/test.rb e la versione desiderata in config/environments/development.rb. Ho creato development.rb :test come ho popolato il mio database usando Faker e lo ho modificato in smtp quindi ero sicuro che le e-mail vere fossero inviate come controllo aggiuntivo.

Nota: per rendere effettive queste modifiche è necessario riavviare il server.

Un'altra nota: Heroku's current SendGrid Instructions mettere il codice di configurazione SendGrid Heroku in una nuova/inizializzatori/file di configurazione mail.rb che probabilmente richiedono la rimozione sua ultima linea e mettendo la versione desiderata in ogni config/ambienti/[production.rb , development.rb, test.rb]

+1

+1 per quella nota sulle istruzioni sendgrid di heroku, grazie! –

+0

Grazie per le informazioni sulle sostituzioni! Era quello che dovevo sapere per rendere di nuovo verdi tutti i miei test. –

12

forse utile ...

mio config/environment.rb ha non contiene ActionMailer::Base.delivery_method = :smtp e il mio config/ambienti/test.rb ha contengono ActionMailer::Base.delivery_method = :test ma Rails ancora consegnato mailer durante i test.

Ho semplicemente aggiunto quanto segue a config/environments/test.rb risolvere:

config.action_mailer.perform_deliveries = false 
0

ho affrontato la situazione simile in Rails4.2 (integrazione ActiveJob con ActionMailer), anche se ho fatto non delivery_method scrittura =: smtp in config/environment.rb.

Nel mio caso, il problema si è verificato dopo l'utilizzo di "resque" come background worker. Infine, ho scoperto che la seguente configurazione era SBAGLIATO:

config/initializers/active_job.rb:

Rails.application.config.active_job.queue_adapter = :resque # here is WRONG 

... perché effettuata modo test pure.

Quindi, ho impostato "queue_adapter =: resque" solo in config/environments/{development, production.rb}. Ora, funziona come mi aspetto.