2012-03-13 19 views
5

estoy leyendo a través de algún Rspec escrito por alguien que dejó la compañía. Me gustaría saber donde esta línea:¿Cuál es el beneficio de Class.new en este Rspec

let(:mailer_class) { Class.new(AxeMailer) } 
    let(:mailer) { mailer_class.new } 

    describe '#check' do 
    before do 
     mailer_class.username 'username' 
     mailer.from '[email protected]' 
     mailer.subject 'subject' 
    end 
    subject { lambda { mailer.send(:check) } } 

está probando esta clase:

class AxeMailer < AbstractController::Base 

    def self.controller_path 
    @controller_path ||= name.sub(/Mailer$/, '').underscore 
    end 

Quiero saber la diferencia entre esto y let(:mailer_class) { AxeMailer }.

Lo pregunto porque en la actualidad cuando corro la prueba, se quejan name es nula. Pero si lo cambié, probará bien.

creo que este problema comenzó después de usar los carriles 3,2, y creo que se hereda de name AbstractController :: Base.

Ésta es la misma en la consola (lo que significa que no es Rspec específica), lo que puedo hacer AxeMailer.name sin error, pero si lo hago Class.new(AxeMailer) no es el problema.

Mis preguntas son:

  1. ¿Hay una razón para usar Class.new(AxeMailer) sobre AxeMailer
  2. ¿Hay un problema si sólo cambiar esto?
  3. ¿Hay alguna manera de no cambiar la especificación y hacerla pasar?
+0

¿Se puede publicar más del código de prueba además del método 'let'? Eso nos ayudaría a determinar por qué fue escrito de esta manera. –

+0

acaba de agregar algo, ¿sería suficiente? – lulalala

+0

para mí, no hay ninguna razón. – shingara

Respuesta

2

supongo que fue escrito esto era debido a la línea mailer_class.username 'username'. Si acaba de usar AxeMailer directamente, la configuración username se transferirá entre las pruebas. Al crear una nueva subclase para cada prueba, puede asegurarse de que no se transfiera ningún estado entre ellas.

+0

Creo que esta es probablemente la razón (que de todos modos no es tan importante). Lo modifiqué a: '@controller_path || = parent.name.sub (/ Mailer $ /, '') .underscore' y parece pasar por ahora – lulalala

0

No sé si mailer_class está siendo utilizado dentro de la especificación real o no, pero esto es lo que creo que su configuración debe ser similar:

let(:mailer) { AxeMailer.new } 

describe '#check' do 
    before do 
    AxeMailer.username 'username' 
    mailer.from '[email protected]' 
    mailer.subject 'subject' 
    end 
    subject { lambda { mailer.send(:check) } } 

No solo no parece ser una necesidad para la clase anónima que se estaba creando. Además, esta es solo mi opinión, pero tu subject parece un poco extraño. Su especificación probablemente debe envolver el tema en una lambda si es necesario, pero no lo haga en su subject.

En cuanto el error que estaban viendo un principio, las clases anónimas no tienen nombres:

1.9.3-p0 :001 > Class.new.name 
=> nil 

Una parte de ActionMailer :: Base debe intentar utilizar el nombre de clase para algo (la tala tal vez) y se rompe cuando es nulo.

+0

Gracias. El 'nombre' se usa en el método' self.controller_path'. Está anulando el 'selfController_path' de' AbstractController :: Base'.Como está actualizando una especie de 'AbstractController :: Base' debería funcionar también (y ha estado funcionando previamente). – lulalala

Cuestiones relacionadas