2012-01-20 9 views
8

Voglio testare un metodo definito in un'attività rake.Test di un metodo definito in un'attività di rake

file di rake

#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 

Ora, voglio provare questo metodo, task_needs_to_run? in un file di test Come posso fare questo?

Nota aggiuntiva: Preferirei testare anche un altro metodo privato nel task rake ... Ma posso preoccuparmene dopo.

risposta

6

Si può solo fare questo:

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

ho provato io stesso ... la definizione di un metodo all'interno di uno spazio dei nomi Rake è la stessa definendolo al livello superiore.

load ing rakefile non esegue nessuno dei task ... li definisce semplicemente. Quindi non c'è nulla di male nello load nel tuo Rakefile all'interno di uno script di test, così puoi testare i metodi associati.

+0

Potete per favore approfondire questo? Mi dispiace di non aver potuto seguire – Garfield

+0

@Shikher, ho fatto qualche esperimento e ho trovato una risposta molto migliore. Dare un'occhiata! –

8

Il solito modo per farlo è quello di spostare tutto il codice vero e proprio in un modulo e lasciare l'attuazione compito di essere solo:

require 'that_new_module' 

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

Se si utilizzano le variabili ambientali o argomento di comando, basta passare:

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

In questo modo è possibile testare e ridefinire l'implementazione senza toccare affatto l'attività di rake.

Problemi correlati