2012-03-18 7 views
5

Tengo una aplicación estándar de Rails 3.2 con un comportamiento extraño.Spork causando un error de método indefinido en mi aplicación Rails?

Puedo ejecutar rspec spec/ sin ejecutar spork y todas las pruebas pasan sin problemas.

Luego enciendo spork y vuelvo a ejecutar las especificaciones. Esta vez, todas las pruebas que toca uno de mis programas de correo fallará con el mismo error:

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)>' 

Entonces, sólo para hacer que todo sea un poco más raro, que puede funcionar directorios o características individuales, con o sin spork en marcha, y todo pasa sin problema por ejemplo, rspec spec/mailers o rspec spec/models.

Aquí es el método que estoy siendo dicho no está definido:

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 

¿Alguna idea de lo que podría estar sucediendo?

+0

@duckufuzz, ¿encontró la solución? –

+1

No. Estoy planeando sacar Spork de la aplicación pronto. Me encanta spork cuando funciona, pero me parece que no puedo confiar en él la mayor parte del tiempo. –

+0

Sin el código de fábrica y de prueba, es difícil responder a esta pregunta. – Wes

Respuesta

0

Después de pasar algún tiempo ajustando Spork, creo que es posible solucionar esto.

Por alguna razón, Spork no está cargando el archivo InvitationMailer. Entonces, lo único que puede hacer es requerirlo dentro del bloque Spork.each_run do.

Además, aquí es el proceso que he utilizado para diagnosticar problemas de Spork:

  1. mover todo en el asistente de especificación excepción de require 'spork' al interior del bloque Spork.prefork do. Asegúrese de que no haya errores. Use time para ver qué tan rápido.
  2. Mueva un código en el bloque Spork.each_run do.
  3. Compruebe si el error ocurre. Use time para ver qué tan rápido se ejecutan las pruebas.
  4. Ver si se produce el error. Si es así, mueva un código de regreso al pre_fork.
  5. Sigue moviendo cosas hasta que descubras lo que debe estar en el bloque prefork y cuánto más rápido se ejecuta.

Este proceso se explicó en este RailsCast.

Cuestiones relacionadas