在Rspec测试中运行Rake任务

xen*_*tek 49 ruby tdd rake rspec ruby-on-rails-3

我正在构建一个集成测试套件,我需要有一个逻辑,我需要一个干净的数据库.如何在我db:test:purge的一个测试中运行任务?

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

小智 55

您可以按如下方式调用Rake任务:

require 'rake'
Rake::Task[name].invoke
Run Code Online (Sandbox Code Playgroud)

在这种情况下,这将导致以下代码:

require 'rake'
Rake::Task['db:test:purge'].invoke
Run Code Online (Sandbox Code Playgroud)

  • 我认为有时需要通过调用`MyRailsApp :: Application.load_tasks`来加载任务 (16认同)
  • @egezer 使用 `MyRailsApp::Application.load_tasks` 使我测试了污染问题,如果 `load_tasks` 已经在测试套件的早期调用,我的 rake 任务将被多次调用。使用“Rake.application.rake_require”和“Rake::Task.define_task(:environment)”避免了这个问题。 (4认同)

Ser*_*kyy 34

当我需要执行自己的rake任务时,批准的答案对我不起作用

这是我的解决方案

放在spec文件的顶部

require 'rake'
Run Code Online (Sandbox Code Playgroud)

将这些行放在需要执行自定义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
Run Code Online (Sandbox Code Playgroud)

我的环境:

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) 
Run Code Online (Sandbox Code Playgroud)

  • 我正在使用:`Rake.application.rake_require"tasks/task-name"`来加载正在测试的特定任务,而不是使用`Rails.application加载所有这些任务.load_tasks`(Rails 5,Rspec 3.5) (5认同)
  • 嗨,相反,我已经使用_Rails.application.load_tasks_,下面需要'耙'。这是一个好的解决方案吗? (2认同)

cod*_*hal 11

如果我们需要使用多个rake任务,我们可以添加

require "rake"
Rails.application.load_tasks
Run Code Online (Sandbox Code Playgroud)

然后简单地调用任何任务.

Rake::Task['sync:process_companies'].invoke
Run Code Online (Sandbox Code Playgroud)

虽然我无法确认它是否较慢,因为它加载了所有任务

  • 使用`Rails.application.load_tasks`使我测试了污染问题,如果先前在同一套件中已经调用过`load_tasks`,则我的耙任务将被多次调用。使用上述解决方案可以避免此问题。 (2认同)