2014-11-24 198 views
0

我有一個非常簡單的Rakefile測試一枚紅寶石小寶石。它看起來像這樣:Can Rake可以在單獨的Ruby實例中運行每個測試嗎?

Rake::TestTask.new 
task :default => :test 

它調用兩個測試來定義具有相同名稱的常量。這導致的錯誤是由第二測試這樣的輸出:

warning: already initialized constant xxxxx 

這樣做的原因是因爲耙執行所有單個Ruby的實例中的測試:

/usr/bin/ruby -I"lib" -I"/usr/lib/ruby/gems/2.1.0/gems/rake-10.3.2/lib" "/usr/lib/ruby/gems/2.1.0/gems/rake-10.3.2/lib/rake/rake_test_loader.rb" "test/test*.rb" 

我應該如何規定每個測試應該在單獨的Ruby實例中運行?

我已經實現了這個,如下圖所示,但我不知道是否有更好的辦法,因爲這種解決方案不適用於大量測試很好地擴展。

Rake::TestTask.new(:one) { |t| t.test_files = %w(test/test_one.rb) } 
Rake::TestTask.new(:two) { |t| t.test_files = %w(test/test_two.rb) } 
task :default => [:one, :two] 
+0

也許更容易改變測試,這樣他們可以使用默認設置運行。將常量定義移動到幫助程序文件中或在測試的命名空間下定義它。 – Stefan 2014-11-24 11:14:57

+0

對我來說,最簡單的事情是去與上面,因爲我只有兩個測試。不過,我希望這個問題能夠揭示出一個更好的方法,但以防萬一我錯過了一些微不足道的東西。這是一個一次性的場景,也有相同的獨立腳本的兩個版本,這是不值得重構只是爲了解決這一具體問題。該測試是在一個名爲'afsplitter'如果你有興趣的背景下,我已經穿上了RubyGems的寶石。 – starfry 2014-11-28 11:43:04

+0

您應該使用一個測試套件,如[MINITEST(https://github.com/seattlerb/minitest) – Stefan 2014-11-28 12:03:45

回答

0

而不是使用Rake::TestTask的,你可以定義你的Rakefile;測試任務,通過每個測試文件循環和與sh像這樣運行它們:

task :test do 
    libs = ['lib', 
      '/usr/lib/ruby/gems/2.1.0/gems/rake-10.3.2/lib', 
      '/usr/lib/ruby/gems/2.1.0/gems/rake-10.3.2/lib/rake/rake_test_loader.rb'] 
    test_files = FileList['test/**/test*.rb'] 

    test_files.each do |test_file| 
    includes = libs.map { |l| "-I#{l}"}.join ' ' 
    sh "ruby #{includes} #{test_file}" 
    end 
end 
相關問題