2009-08-10 12 views

Odpowiedz

16

Zadania rake są dość trudne do przetestowania. Najprostszym rozwiązaniem byłoby przeniesienie logiki do metody w odpowiednim modelu. Możesz przetestować to i po prostu wywołać metodę z zadania rake.

+0

Myślę, że ta propozycja jest przyzwoity, ale to nie jest odpowiedź na pytanie. Nie powinieneś zanieczyszczać modeli, aby uruchamiać skrypty wsadowe itp. Na swoich danych. –

+0

Mam lepszą odpowiedź tutaj: http://stackoverflow.com/a/926100/94120 –

3

to dość dobrze opisane w another SO question

moje zalecenie, powtarzające się tutaj w skrócie, to nie próbować zadania testowania Zgrabiarka: wyodrębnić kod należy badać do klasy modelu lub funkcji lib i przetestować go tam. Następnie użyj prowizji, aby wywołać funkcje i zarządzać zależnościami.

17

Coś jak:

def execute_rake(file,task) 
    require 'rake' 
    rake = Rake::Application.new 
    Rake.application = rake 
    Rake::Task.define_task(:environment) 
    load "#{Rails.root}/lib/tasks/#{file}" 
    rake[task].invoke 
    end 

Na swojej specyfikacji:

execute_rake("tags.rake","tags:popular") 
+1

rake [zadanie] .invoke zamiast rake [tagi] .invoke – standup75

+0

niesamowite odpowiedzi. Ten ładunek sprawił, że podczas testowania zadań rake'owych dla klejnotów. –

+0

To jest zły pomysł. To działa, dopóki nie będziesz musiał używać prowizji, aby uruchomić testy. W takim przypadku twoje testy zakończą się bezgłośnie z niezerowym kodem wyjścia, ale rspec będzie zgłaszać wszystkie testy. –

1

Lubię PivotalLabs' way najbardziej. Ja jednak uogólniać i modyfikować swój kod, jak na moim app:

# file: spec/tasks/my_rake_file_spec.rb 
require 'spec_helper' 
require 'rake' 

describe 'my_rake_file.rake' do 
    before :all do 
    Rake.application.rake_require 'tasks/my_rake_file' 
    Rake::Task.define_task(:environment) 
    end 

    let(:run_rake_task) { 
    Rake::Task[task_name].reenable 
    Rake.application.invoke_task task_name 
    } 

    describe 'my_task_name' do 
    let(:task_name) { "my_task_name" } 

    it "creates 10 cars" do 
     run_rake_task 
     Car.count.should == 10 
    end 
    end 
end 

Również ja ekstrakcji podnoszenia ciężkich kodu my_rake_file.rake do modułu, który jest przechowywany w lib/