2011-08-01 158 views
47

我構建了一個集成測試套件,並且有一點邏輯需要我有一個乾淨的數據庫。我如何在我的一個測試中運行db:test:purge任務?在Rspec測試中運行Rake任務

我使用:紅寶石1.9.2,3.0.9導軌,RSpec的2.6

+0

不相同RSpec的:http://stackoverflow.com/questions/3530/how-do-i-rake-tasks-within -a-ruby-script –

回答

51

您可以調用Rake任務如下:

require 'rake' 
Rake::Task[name].invoke 

在這種情況下,這將導致在下面的代碼:

require 'rake' 
Rake::Task['db:test:purge'].invoke 
+0

這樣做了。謝謝。我也有錯誤的任務名稱,一開始就把我拋棄了。在Rails 3中,rake測試:準備好似乎在做訣竅 – xentek

+1

@jim好點。您可以在這些實例中使用Rake::Task[name].execute,但您需要確保滿足其中的任何依賴項(例如':environment'),因爲在使用此方法調用任務時不會運行這些依賴項。 – xentek

+0

這很有幫助。如何將參數傳遞給任務給出上面的例子? – n8gard

32

批准的回答並沒有爲我工作,當我需要執行我自己的耙子任務

這是我的解決方案

放在規範文件

require 'rake' 

放置在您需要執行自定義rake任務這些線路,例如頂部耙update_data從文件example.rake

load File.expand_path("../../../lib/tasks/example.rake", __FILE__) 
# make sure you set correct relative path 
Rake::Task.define_task(:environment) 
Rake::Task["update_data"].invoke 

我的環境:

rails (4.0.0) 
ruby (2.0.0p195) 
rspec-core (2.14.7) 
rspec-expectations (2.14.3) 
rspec-mocks (2.14.4) 
rspec (2.14.1) 
rspec-rails (2.14.0) 
+1

嗨,而不是我已經使用_Rails.application.load_tasks_,下面需要'耙'加載任務。這是一個好的解決方案嗎? – coderVishal

+0

'Rake :: Task.define_task(:environment)'避免了'RuntimeError:不知道如何構建任務'環境'(請參閱 - 任務)' – s2t2

+3

我正在使用:'Rake.application。 rake_require「tasks/task-name」加載正在測試的特定任務,而不是使用Rails.application加載所有任務。 load_tasks'(Rails 5,Rspec 3.5) – Steve

9

如果我們需要使用多個耙任務,我們可以添加

require "rake" 
Rails.application.load_tasks 

然後只需調用任何任務。

Rake::Task['sync:process_companies'].invoke 

雖然如果慢,因爲它加載的所有任務,我不能確認