2009-04-28 8 views
41

Tengo un modelo que obtiene sus datos de un objeto analizador. Estoy pensando que la clase de analizador debería vivir en el directorio lib/(aunque podría persuadirse de que debería vivir en otro lugar). La pregunta es: ¿dónde deberían estar las pruebas de mi unidad para la clase de analizador? ¿Y cómo me aseguro de que se ejecuten cada vez que ejecuto la prueba de rake?Rieles: ¿Cómo probar el código en el directorio lib /?

Respuesta

24

En la aplicación Rails en la que estoy trabajando, decidí simplemente colocar las pruebas en el directorio test\unit. También se anidan ellos por el módulo/directorio, así, por ejemplo:

lib/a.rb => test/unit/a_test.rb 
lib/b/c.rb => test/unit/b/c_test.rb 

Para mí, este fue el camino de la última resistencia, ya que estas pruebas corrieron sin tener que hacer ningún otro cambio.

+2

Esto ya no funciona con Rails 5 – Qqwy

20

Aquí hay una manera:

Crear lib/tasks/test_lib_dir.rake con la siguiente

namespace :test do 

    desc "Test lib source" 
    Rake::TestTask.new(:lib) do |t|  
    t.libs << "test" 
    t.pattern = 'test/lib/**/*_test.rb' 
    t.verbose = true  
    end 

end 

imitan la estructura de su directorio lib bajo la test dir, en sustitución de código lib con las pruebas correspondientes.

Ejecute rake test:lib para ejecutar sus pruebas de lib.

Si desea que se ejecuten todas las pruebas al invocar rake test, puede agregar lo siguiente a su nuevo archivo de rake.

lib_task = Rake::Task["test:lib"] 
test_task = Rake::Task[:test] 
test_task.enhance { lib_task.invoke } 
+0

De alguna manera no carga el entorno (específicamente 'accesorios 'de ActiveSupport'), y no hay forma de forzarlo en rakefile. –

+1

Oye, probé tu solución y 'rake test: lib' ejecuta mi prueba, pero' rake test' no. Lo copié al pie de la letra. Aquí hay un enlace al contenido de mi archivo: http://pastebin.com/FHMXU6vG ¡Gracias de antemano! – robert

8

yo estaba buscando para hacer lo mismo pero con rspec & Autospec y se tomó un poco de investigación para averiguar dónde estaban recibiendo la lista de patrones de directorios/archivos que dictaron que los archivos de prueba para correr. En última instancia, encontré esto en lib/tareas/rspec.rake: 86

[:models, :controllers, :views, :helpers, :lib, :integration].each do |sub| 
    desc "Run the code examples in spec/#{sub}" 
    Spec::Rake::SpecTask.new(sub => spec_prereq) do |t| 
     t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""] 
     t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"] 
    end 
    end 

había colocado mis pruebas en un nuevo directorio spec/libs cuando el archivo rpsec.rake fue configurado para buscar en la especificación/lib. Simplemente renombrar libs -> lib hizo el truco!

+0

Tengo '/ lib' de forma predeterminada en mi proyecto de alguna manera. Desafortunadamente 'rake test' no pone al día los archivos, por lo tanto, esto es solo RSpec y tengo que usar la solución anterior. –

0

Para no definir tareas adicionales de rake para ejecutar pruebas desde las carpetas definidas personalizadas, también puede ejecutarlas con el comando rake test:all. La estructura de las carpetas de prueba para la carpeta lib o cualquier otra carpeta personalizada depende de usted. Pero prefiero duplicarlos en las clases: lib se corresponde con test/lib, app/form_objects a test/form_objects.

3

Una manera fácil y limpia es simplemente crear un directorio bajo prueba/unidad/lib. A continuación, cree la prueba como test/unit/lib/foo_test.rb correspondiente a lib/foo.rb. No se requieren nuevas tareas de rake, y puede anidar más directorios si es necesario para que coincida con la estructura del directorio lib.

-2

Uso:

[spring] rake test:all 

a ejecutar todas las pruebas, incluyendo los directorios que ha creado (como [root]/test/lib/).

Omitir [spring] si tou no lo está utilizando.

+0

¡rake abortado! No sé cómo compilar la tarea 'test: all' – Intentss

3

Como de Rails 4.0:

rake test:all   # Run all tests in any subdir of `test` without resetting the DB 
rake test:all:db  # Same as above and resets the DB 

Como de Rails 4.1, redefinir test:run a incluir tareas adicionales cuando se ejecuta rake o rake test:

# lib/tasks/test.rake 

namespace :test do 
    Rake::Task["run"].clear 
    task run: ["test:units", "test:functionals", "test:generators", "test:integration", "test:tasks"] 

    ["tasks"].each do |name| 
    Rails::TestTask.new(name => "test:prepare") do |t| 
     t.pattern = "test/#{name}/**/*_test.rb" 
    end 
    end 
end 

Esto tiene la ventaja añadida de definir rake test:tasks en el ejemplo dado .

A partir de Rails 4.2, test:run incluye todos los subdirectorios de test incluyendo ellas cuando se ejecuta rake test, y por lo tanto rake.

+0

En Rails 5, estas tareas diferentes ya no existen. – Qqwy

Cuestiones relacionadas