2012-09-19 22 views
7

Tengo un motor Rails diseñado para proporcionar algunos modelos y controladores a un proyecto más grande nuestro. Hay un conjunto bastante decente de especificaciones para el motor, usando un montón de simulacros y algunos modelos a escala completa y controladores dentro de la aplicación ficticia del motor para asegurarse de que el motor está haciendo lo que se supone que debe hacer y trabajando con la aplicación más grande.¿Puedo ejecutar las especificaciones de un motor Rails desde una aplicación real que lo monte?

Sin embargo, incluso con todas las pruebas aprobadas, con frecuencia encuentro un comportamiento defectuoso cuando actualizo el motor en la aplicación más grande. Si mis pruebas están pasando pero el comportamiento está roto, claramente algo anda mal con las pruebas, pero ¿qué? ¿Me estoy burlando demasiado o no soy suficiente?

Para que esté más cerca de resolver esto, me gustaría poder ejecutar las pruebas del motor desde dentro de la aplicación completa. Parece que debería ser posible, pero no entiendo rspec lo suficiente para entender cómo.

(Esto se relaciona con this question pero no exactamente lo mismo;. No estoy tratando de ejecutar todas las especificaciones de un comando, sólo para ejecutar las especificaciones del motor dentro del entorno de aplicación completa This también parece estar relacionado realidad. , He leído todas las preguntas etiquetadas con y --no son muchas - y tampoco todas ellas son lo que necesito, o no tengo respuesta.)

Respuesta

13

La solución más simple sería especificar las rutas en el comando rspec. Si tiene estructura de directorios

/project 
/engine 
/engine_2 

continuación, hacer y debe ejecutar todas las especificaciones

cd project 
rspec spec/ ../engine/spec ../engine_2/spec 

Pero si desea ejecutar especificaciones en continuo Integración o simplemente esto no parece estar cómodo Solucioné este problema con una tarea personalizada de rastrillo, cambiando el método de patrón.

lib/task/rspec.rake deberían tener este aspecto

require "rspec/core/rake_task" 

RSpec::Core::RakeTask.new(:spec) 

task :default => :spec 
RSpec::Core::RakeTask.module_eval do 
    def pattern 
    extras = [] 
    Rails.application.config.rspec_paths.each do |dir| 
     if File.directory?(dir) 
     extras << File.join(dir, 'spec', '**', '*_spec.rb').to_s 
     end 
    end 
    [@pattern] | extras 
    end 
end 

En clase de motores se agrega una ruta a config.rspec_paths

class Engine < ::Rails::Engine 
    # Register path to rspec 
    config.rspec_paths << self.root 
end 

y no se olvide de inicializar config.rspec_paths en algún lugar de un proyecto base.

Si desea agregar fábricas, puede crear el inicializador, puede encontrar la solución en algún lugar aquí en stackoverflow.

No estoy seguro si esta solución es la mejor pero funciona para mí y estoy contento con eso. ¡Buena suerte!

+1

"¡Funciona para mí y estoy contento con eso" es una respuesta perfectamente buena en cualquier situación! En este caso, puedo comenzar simplemente con el suministro de la ruta, por lo que 'bundle exec rspec \' bundle show engine_name \ '/ spec' como su respuesta sugiere que funciona bien. – pjmorse

+0

No pude hacer que esto funcione con la configuración de mi aplicación/motor. Las especificaciones del motor nunca funcionaron. ¿Podrías proporcionarme una esencia con más detalles? – BM5k

+0

Aquí hay una esencia de nuestro proyecto https://gist.github.com/kamilio/5582548 –

Cuestiones relacionadas