2

我想編寫rake任務來自定義測試。例如,運行單元測試,我創建了下面的代碼文件並將其保存爲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 

好吧,其實有一個較短的版本。該cd指令有一個特殊的別名,如其他答覆中提到Chris,所以你可以...

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

我想你可能會突出一句話:「沒有必要光盤」。我想說,如果不用塊調用,它可能會有點危險,因爲它會(如果它不是相同的話)更改當前目錄中的所有其他操作。而且,你的第一個使用'sh「cd ...」'的建議將不起作用,因爲路徑只會在新的shell進程中改變,只要目錄改變就會結束。 – Arsen7

1

您試圖對不在字符串中的值進行插值處理,並且您還將rake test:units當作是使用參數進行方法調用,但實際上並非如此。

更改cd行,以便您調用值爲Rails.root的方法,並將第二行更改爲shell指令。

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

這會拋出一個錯誤:未定義的局部變量或方法'單元'爲main:Object'。 –

+0

我只讀並修復了第一行。我現在已經將第二行更新爲系統命令,所以代碼中沒有錯誤。儘管如此,還是有更合適的方法來做到這一點,正如[jmonteiro](http://stackoverflow.com/users/131947/jmonteiro)所述。 – Chris

+0

這也引發了一個錯誤。添加'--trace'顯示'rake aborted!Command failed with status(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:在'block in sh'' –

相關問題