2012-01-20 12 views
8

Quiero probar un método definido en una tarea de rake.Prueba de un método definido en una tarea de rake

archivo rastrillo

#lib/tasks/simple_task.rake 
namespace :xyz do 
    task :simple_task => :environment do 
     begin 
      if task_needs_to_run? 
       puts "Lets run this..." 
       #some code which I don't wish to test 
       ... 
      end 
     end 
    end 
    def task_needs_to_run? 
     # code that needs testing 
     return 2 > 1 
    end 

end 

Ahora, yo quiero probar este método, task_needs_to_run? en un archivo de prueba ¿Cómo se hace esto?

Nota adicional: Lo ideal sería que desee probar otro método privado en la tarea de rake también ... Pero puedo preocuparme por eso más adelante.

Respuesta

6

Usted puede simplemente hacer esto:

require 'rake' 
load 'simple_task.rake' 
task_needs_to_run? 
=> true 

yo probamos este mismo ... la definición de un método dentro de un espacio de nombres Rake es la misma que definirlo en el nivel superior.

load ing a Rakefile no ejecuta ninguna de las tareas ... solo las define. Por lo tanto, no hay ningún daño en load en su Rakefile dentro de un script de prueba, por lo que puede probar los métodos asociados.

+0

¿Puede por favor explicar esto? Lo siento, no pude seguir – Garfield

+0

@Shikher, hice algunos experimentos y se me ocurrió una respuesta mucho mejor. ¡Echar un vistazo! –

8

La forma habitual de hacerlo es mover todo el código real en un módulo y salir de la aplicación de tareas a ser solamente:

require 'that_new_module' 

namespace :xyz do 
    task :simple_task => :environment do 
    ThatNewModule.doit! 
    end 
end 

Si utiliza variables ambientales o argumento de comando, sólo tiene que pasar en:

ThatNewModule.doit!(ENV['SOMETHING'], ARGV[1]) 

De esta manera puede probar y refactorizar la implementación sin tocar la tarea de rake en absoluto.

Cuestiones relacionadas