2

テストをカスタマイズするためにレーキタスクを作成したいと思います。例えば、ユニットテストを実行するために、私は次のコードを含むファイルを作成したとlib /タスク/ test.rakeとしてそれを保存:Rails 3でテストを実行するにはどのようにタスクを記述しますか?

task :do_unit_tests do 
    cd #{Rails.root} 
    rake test:units 
end 

rake do_unit_testsの実行中にエラーがスローされます。can't convert Hash into String

Rails 3.0.7で作業し、組込みユニットテストフレームワークを使用しています。

ありがとうございました。

答えて

3

cdの必要はありません。あなたは...単に

task :do_unit_tests do 
    Rake::Task['test:units'].invoke 
end 

をすることができますが、あなたが本当にcdする場合は、それはあなたがシェル命令を呼び出す方法は次のとおりです。

task :do_unit_tests do 
    sh "cd #{Rails.root}" 
    Rake::Task['test:units'].invoke 
end 

まあ、実際には短いバージョンがあります。 Chrisは他の回答で述べたようにcd命令は、特別なエイリアスを持っているあなただけ...

task :do_unit_tests do 
    cd Rails.root 
    Rake::Task['test:units'].invoke 
end 

は、あなたがさらに移動したいことができる場合ので、私はJason Seifer's Rake TutorialMartin Fowler's Using the Rake Build Language記事をお勧めします。両方とも素晴らしいです。

+0

ありがとう。推奨された読みは役に立ちます。 –

+1

私はあなたが文章を強調表示するかもしれないと思います:「cdする必要はありません。ブロックで呼び出されていないときには、他のすべてのアクションのためにカレントディレクトリを変更する(それがまだ同じでない場合)ため、少し危険かもしれません。また、 'sh 'cdを使うことの最初の提案は...' 'は動作しません。これは、ディレクトリが変更されるとすぐに終了するシェルの新しいプロセスでのみパスが変更されるためです。 – Arsen7

1

文字列にはない値を補間しようとしていますが、引数なしのメソッド呼び出しのようにrake test:unitsも処理しています。

Rails.rootの値を持つメソッドを呼び出すようにcd行を変更し、2行目をシェル命令に変更します。

task :do_unit_tests do 
    cd Rails.root 
    `rake test:units` 
end 
+0

これは、エラー: '未定義のローカル変数またはメソッド '単位' for main:Object'をスローします。 –

+0

私は最初の行だけを読んで固定しました。 2行目をシステムコマンドに更新したので、コードにエラーはありません。それでも、これを行うより適切な方法があります。[jmonteiro](http://stackoverflow.com/users/131947/jmonteiro)が説明しています。 – Chris

+0

これもエラーを投げた。 '--trace'を追加すると' rake aborted! 'コマンドはステータス(1)で失敗しました:[/home/baller/.rvm/rubies/ruby-1.9.2-p180/b ...] /home/baller /。 rvm/gems/ruby​​-1.9.2-p180/gems/rake-0.8.7/lib/rake.rb:995:in 'block in sh'' –

関連する問題