将命令行参数动态传递给RSpec RakeTask

时间:2016-03-27 08:06:21

标签: ruby rspec rake

  

rspec命令附带了几个可用于自定义的选项   RSpec的行为,包括输出格式,过滤示例等。

例如:

$ rspec path/to/spec_file.rb
$ rspec --example 'first example'
$ rspec --tag type:special
$ rspec -P "**/*_test.rb"

如何使用rake spec(使用完整Rspec选项)执行相同的操作。
我的Rakefile

require 'bundler/gem_tasks'
require 'rspec/core/rake_task'

task default: :spec

RSpec::Core::RakeTask.new(:spec)

我一直在谷歌但没有找到任何完整的答案。感谢。

2 个答案:

答案 0 :(得分:2)

命令行参数可以自动传递给ENV哈希。

例如:

  • 从命令行:FOO=BAR rspec spec/*spec.rb
  • RSpec内部:puts ENV["FOO"] # => "BAR"

在你的Rakefile中,你可以使用反引号来调用shell命令。

答案 1 :(得分:2)

您可以这样做,但需要进行一些更改。 首先,您需要取消定义已定义的规范任务(如果存在),然后再次定义它。 或者使用其他名称,例如spec_with_opts。虽然我经历了重命名。

在Rakefile中

Rake::Task["spec"].clear
RSpec::Core::RakeTask.new(:spec) do |task, args|
  task.rspec_opts      = ENV['RSPEC_OPTS']            if ENV['RSPEC_OPTS'].present?
  task.pattern         = ENV['RSPEC_PATTERN']         if ENV['RSPEC_PATTERN'].present?
  task.exclude_pattern = ENV['RSPEC_EXCLUDE_PATTERN'] if ENV['RSPEC_EXCLUDE_PATTERN'].present?
end

task default: :spec

所以它现在可以这样运行:

rake spec RSPEC_PATTERN=path/to/spec_file.rb
rake spec RSPEC_OPTS="--example 'first example'"
rake spec RSPEC_OPTS="--tag type:special"

这个不会工作,你需要使用RSPEC_PATTERN

rake spec RSPEC_OPTS="-P '**/*_test.rb'" 

您可以找到可在源文件中定义的其他选项: https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/rake_task.rb