繁体   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