如何在 rake 任务中调用 RSpec?

How to invoke RSpec inside a rake task?

我们写了一些必要的测试,但是很慢。因此,我们配置 RSpec 以排除它们,除了在 Solano 上,我们在其中设置了一个 ENV 变量。

# spec_helper
unless ENV['RUN_ALL_TESTS'] == 'true'
  config.filter_run_excluding :slow
end

这行得通,但我正在尝试编写一个 rake 任务,我们可以通过设置相同的 ENV 变量然后 运行 连接套件来调用 运行 每个本地测试。我无法弄清楚如何触发 RSpec。这就是我现在得到的:

# all_tests.rake
require 'rspec/core/rake_task'

desc 'Run all tests, even those usually excluded.'
task all_tests: :environment do
  ENV['RUN_ALL_TESTS'] = 'true'
  RSpec::Core::RakeTask.new(:spec)
end

当我 运行 它时,它不会 运行 任何测试。

我发现的大部分内容都是用于在测试中触发 rake 任务、测试 rake 任务或设置 Rakefile。我们正在使用 rspec-rails,我们的默认 rake 任务已经设置好。

为了 运行 RSpec 通过其 rake 集成,您需要定义一个任务并调用它:

# all_tests.rake
require 'rspec/core/rake_task'

# Define the "spec" task, at task load time rather than inside another task
RSpec::Core::RakeTask.new(:spec)

desc 'Run all tests, even those usually excluded.'
task all_tests: :environment do
  ENV['RUN_ALL_TESTS'] = 'true'
  Rake::Task['spec'].invoke
end

Rake::Task['spec'].invoke 当你尝试它时什么也没做,因为 rake 在命令行和在 Rake::Task。你没有定义 'spec' 任务,但是你有一个 spec 目录,所以 rake spec 运行 没有错误,什么也没做。

我遇到了类似的问题,其中 bundle exec rake default 会正确地创建一个 RSpec::Core::RakeTask,但是 bundle exec rake spec 会在 spec 目录中创建一个 Rake::FileTask,用 bundle exec rake spec --trace 输出:

** Invoke spec (first_time, not_needed)

原来 rspec-rails:test gem 组中,它需要 (per the docs) 在 :test:development.

有趣的是 (?),一旦我这样做了,以前只在 :test 组中的 gem 也可以从规范中获得,即使在使用 RAILS_ENV=development 启动时也是如此。我认为 rspec-rails 在幕后进行了一些魔法环境恶作剧。