2009-08-10 7 views

答えて

16

レーキタスクはかなりテストするのが難しいです。最も簡単な解決策は、ロジックを適切なモデルのメソッドに移動することです。それをテストし、レーキタスクからメソッドを呼び出すだけです。

+0

私は、これはまともな提案だと思うが、それは質問に答えていません。データにバッチスクリプトなどを実行するためにモデルを汚染する必要はありません。 –

+0

私はここに良い答えがあります:http://stackoverflow.com/a/926100/94120 –

3

これはかなりよく要約にここでは繰り返さanother SO question

私の推薦で覆われ、すくいタスクをテストしようとするではありません:クラス、モデルまたは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 [task]。rake [tags] .invokeの代わりに.invoke – standup75

+0

すばらしい答え。宝石のためにレーキ作業をテストするときに、そのロード物がトリックをしました。 –

+0

これは悪い考えです。これは、あなたがテストを実行するためにレーキを使用する必要があるまで動作します。その場合、テストはゼロ以外の終了コードで自動的に失敗しますが、rspecはすべてのテストが成功したと報告します。 –

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 

はまた、私は今、まあのlib/

関連する問題