2009-08-10 129 views

回答

16

Rake任務很難測試。最簡單的解決方案是將邏輯移入適當模型中的方法。然後你可以測試它,只需從rake任務中調用該方法即可。

+0

我認爲這是一個不錯的建議,但它並沒有回答這個問題。您不應該污染模型才能在數據上運行批處理腳本等。 – 2011-11-29 23:29:24

+0

我在這裏有一個更好的答案:http://stackoverflow.com/a/926100/94120 – 2011-11-29 23:31:43

3

這是很好覆蓋another SO question

我的建議,總之這裏重複,不嘗試測試rake任務:提取代碼進行測試,以一類,模型或LIB功能和測試它。然後只需使用rake調用函數並管理依賴關係。

17

喜歡的東西:

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 

在您的規格:

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

rake [任務] .invoke而不是耙[標籤] .invoke – standup75 2011-04-18 19:41:58

+0

真棒的答案。測試ram任務時,這件負載事物做了詭計。 – 2012-11-30 19:54:56

+0

這是一個壞主意。這個工作,直到你需要使用耙運行你的測試。在這種情況下,您的測試將以非零退出代碼靜默失敗,但rspec將報告所有測試通過。 – 2016-05-16 20:27:41

1

我喜歡PivotalLabs' way最。不過,我概括和修改自己的代碼,隨後在我的應用程序:

# 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 

另外,我提取的my_rake_file.rake的代碼模塊,存儲在LIB繁重/