2011-07-20 15 views
6

Tengo una situación extraña por la cual si ejecuto un archivo de especificación de modelo de rspec individual todos los ejemplos son verdes, si pruebo toda la carpeta de especificaciones/modelos, todos mis ejemplos son verdes. Si pruebo los controladores, todos pasan verde. Si pruebo todo el paquete (a través de la especificación rspec), entonces obtengo fallas: si elimino las pruebas del controlador, todo está completamente verde. Ahora estoy esperando que esto sea completamente autoinfligido, pero no puedo resolverlo.Probar todo el conjunto de Rspec falla

Lo he reducido a ejemplos específicos en las pruebas del controlador, lo que hace que fallen los ejemplos en las especificaciones del modelo.

por ejemplo. en un notes_controller_spec.rb si esta línea está presente

Note.any_instance.stubs(:valid?).returns(false) 

que provoca un fallo en mis modelos/account_spec.rb

Failure/Error: @account.all_notes.should have(2).notes 
ArgumentError: 
comparison of Note with Note failed 
./app/models/account.rb:293:in `sort' 

donde la línea 293 es;

(self.notes + self.transactions.map(&:notes).flatten).sort {|a,b| a.created_at <=> b.created_at } 

Estoy bastante seguro de que este va a ser uno de esos momentos de la palma de la cara, así que sea gentil conmigo!

+0

'' puede ser created_at' las negativas para una de las notas, lo que significa que su bloque de tipo sería comparar las negativas '' contra un Fixnum', lo que provocaría que el bloque devuelva 'nil', lo que haría que el tipo explotara con el tipo de 'ArgumentError' que estás viendo.¿Estás seguro de que todas tus instancias se han guardado en la base de datos cuando se ejecuta esta línea? ¿Es posible que su base de datos no se vacíe antes de cada ejemplo? –

+0

Tengo un problema similar. Tengo la sensación de que puede estar relacionado con [este problema rspec] (https://github.com/rspec/rspec-mocks/issues/54), aunque afirma que se ha corregido. –

+0

lo siento, accidentalmente presioné enter, más detalles: Estoy copiando un método en cualquier instancia de un modelo, un modelo diferente al que estoy probando en el conjunto particular de pruebas. Cuando ejecuto un conjunto diferente de pruebas que requieren ese método, no se encuentra. Sacar el talón en las pruebas en un archivo hace que pase el otro archivo. Realmente molesto. He estado experimentando con la instalación de diferentes versiones de rspec. –

Respuesta

1

¿Está haciendo alguna configuración de fecha en un bloque before: all? Estos no son transaccionales y pueden causar problemas de contaminación de prueba.

Además, creo que la sintaxis podría estar fuera de aquí:

Note.any_instance.stubs(:valid?).returns(false) 

debe ser:

Note.any_instance.stub(:valid?).and_return(false) 
0

que he experimentado problemas similares con RSpec 3 y Rails 4.1. Cada vez que ejecutaba el archivo de especificación problemático por sí mismo, pasaba, mientras que ejecutar el conjunto completo lo haría fallar.

En mi caso, estaba relacionado de alguna manera con las zonas horarias. Estaba estableciendo explícitamente el huso horario en ApplicationController y, por alguna razón, a mis características no me gustó. Si no configuro la zona horaria cuando estoy en el entorno de prueba, todo vuelve a pasar. p.ej.

unless Rails.env.test? 
    Time.zone = "some timezone value here" 
end 
0

Estaba teniendo un problema similar: especificaciones individuales del modelo aprobadas. Cuando ejecuté todo el conjunto de modelos, tuve alrededor de 30 fallas. Lo que hice fue mirar el archivo antes de que ocurrieran todos los fallos. Ahí descubrí que estaba configurando cosas dentro de los hilos y usando default_scopes como en este railscast.

En una cláusula anterior, imprimí el Company.current_id. Como pensaba, cuando se ejecuta de forma individual, Company.current_id era nil. Cuando se ejecutaba el paquete, Company.current_id era 2. Esto es lo que sucede cuando usa ámbitos predeterminados. Para solucionarlo, acabo de establecer Company.current_id en nil en la cláusula before.

Antes

describe Service, type: :model do 
    before do 
    end 
end 

Después

describe Service, type: :model do 
    before do 
    Company.current_id = nil 
    end 
end 
Cuestiones relacionadas