如何在rake任务中调用RSpec?

时间:2016-04-13 18:53:27

标签: ruby-on-rails ruby rspec rake

我们写了一些必要的测试,但速度很慢。因此我们将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任务已经设置完毕。

2 个答案:

答案 0 :(得分:1)

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

# 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::FileTask的文件名{1}}。您没有定义Rake::Task任务,但是您有一个'spec'目录,因此spec运行时没有错误并且什么也没做。

答案 1 :(得分:0)

我有一个类似的问题,bundle exec rake default可以正确地创建RSpec::Core::RakeTask,但bundle exec rake spec会在Rake::FileTask目录上创建一个specbundle exec rake spec --trace输出:

** Invoke spec (first_time, not_needed)

事实证明rspec-rails位于:test宝石组中,:test:development需要:test。< / p>

有趣的是(?),一旦我这样做,以前只在RAILS_ENV=development组中的宝石也可以从规范中获得,即使使用rspec-rails启动也是如此。我假设{ "apple": { "linktext": "apple", "target": "_blank", "href": "http://www.apple.com" }, "blog-article-foo-bar": { "linktext": "foo bar", "href": "http://www.foobar.com" }, "dell": { "linktext": "dell", "target": "_parent", "href": "http://www.dell.com" } } 在幕后参与了一些神奇的环境恶作剧。