2012-03-18 6 views
5

Ho un'app standard di Rails 3.2 con un comportamento strano in corso.Spork che causa errore di metodo non definito nella mia app Rails?

Posso eseguire rspec spec/ senza spork in esecuzione e tutti i test non passano alcun problema.

Quindi accendo spork e eseguo di nuovo le specifiche. Questa volta, ogni prova che tocca uno dei miei programmi di posta non verrà effettuata con lo stesso errore:

Failures: 

    1) InvitationsController GET accept with non-matching token should redirect to the root path 
    Failure/Error: let!(:invitation) { Factory :invitation } 
    NoMethodError: 
     undefined method `invite' for InvitationMailer:Class 
    # ./app/models/invitation.rb:29:in `send_email' 
    # ./spec/controllers/invitations_controller_spec.rb:5:in `block (3 levels) in <top (required)>' 

Poi, proprio per rendere il tutto un po 'strano, posso correre singole directory o specifiche, con o senza Spork esecuzione, e tutto passa senza problemi. ad esempio rspec spec/mailers o rspec spec/models.

Ecco il metodo che mi è stato detto non è definito:

class InvitationMailer < ActionMailer::Base 
    default from: APP_CONFIG[:default_from] 

    def invite(invitation) 
    @invitation = invitation 

    mail(to: @invitation.recipient_email, subject: "the subject") 
    end 
end 

Tutte le idee che cosa potrebbe accadere?

+0

@duckufuzz, hai trovato la soluzione? –

+1

No. Sto pianificando di togliere presto l'app. Amo lo spork quando funziona, ma trovo che non mi fidi più della maggior parte del tempo. –

+0

Senza la fabbrica e il codice di prova è difficile rispondere a questa domanda. – Wes

risposta

0

Dopo aver trascorso qualche tempo a modificare Spork, penso che sia possibile risolvere questo problema.

Per qualche motivo, Spork non sta caricando il file InvitationMailer. Quindi, l'unica cosa che puoi fare è richiederla nel blocco Spork.each_run do.

Inoltre, qui è il processo che ho usato per diagnosticare problemi Spork:

  1. spostare tutto in aiuto specifiche tranne che per require 'spork' alla all'interno del blocco Spork.prefork do. Assicurati che non ci siano errori. Usa time per vedere quanto velocemente.
  2. Spostare un codice nel blocco Spork.each_run do.
  3. Verificare se l'errore si verifica. Utilizzare time per verificare la velocità di esecuzione dei test.
  4. Vedere se si verifica l'errore. In tal caso, spostare nuovamente il codice su pre_fork.
  5. Continua a muovere le cose finché non capisci cosa deve essere nel blocco prefork e quanto più veloce è in esecuzione.

Questo processo è stato spiegato in questo RailsCast.