【问题标题】:pass command-line arguments to RSpec RakeTask dynamically将命令行参数动态传递给 RSpec RakeTask
【发布时间】:2016-07-14 16:48:33
【问题描述】:

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)

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

【问题讨论】:

    标签: ruby rspec rake


    【解决方案1】:

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

    例如:

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

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

    【讨论】:

      【解决方案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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-09
        • 2017-10-22
        • 2019-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多