簡體   English   中英

在 Rspec 測試中運行 Rake 任務

[英]Running Rake tasks in Rspec Tests

我正在構建一個集成測試套件,我需要一個干凈的數據庫來處理一些邏輯。 如何在我的一項db:test:purge運行db:test:purge任務?

我正在使用:ruby 1.9.2、rails 3.0.9、rspec 2.6

您可以按如下方式調用 Rake 任務:

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

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

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

當我需要執行自己的 rake 任務時,批准的答案對我不起作用

這是我的解決方案

放在spec文件的頂部

require 'rake'

將這些行放在您需要執行自定義 rake 任務的位置,例如文件example.rake 中的rake update_data

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) 

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

require "rake"
Rails.application.load_tasks

然后只需調用任何任務。

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

雖然我無法確認它是否更慢,因為它加載了所有任務

我們還需要要求任務

require 'rake'
Rake.application.rake_require 'tasks/new_adapter'

在此之后,只需調用任務

Rake::Task['new:adapter'].invoke

對我來說(rails-6)

Rails.application.load_tasks
Rake::Task['app:sync'].invoke

=> 在我的情況下不需要

上述許多答案對我來說都適用於運行單個規范。 但是,當為單個 rake 任務運行多個規范時,我必須采取額外的步驟。

在每個規范之后,我必須運行Rake::Task.clear ,因為(出於某種原因)如果它被注冊為已經被already_invoked (即如果Rake::Task['my_task'].already_invoked返回),則該任務不會再次運行true

我在我的 rake 任務規范中添加了以下行:

after { Rake::Task.clear }

在為同一個 rake 任務運行多個測試時,一切都按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM