测试使用带有RSpec的OptionParser的Rake任务

时间:2017-04-27 08:06:49

标签: ruby rspec rake

我有一个Rake(12.0)任务,它使用OptionParser来获得一个参数。

任务看起来像

require 'optparse'

namespace :local do
  task :file do
    options = Hash.new

    opts = OptionParser.new
    opts.on('--file FILE') { |file|
      options[:file] = file
    }

    args = opts.order!(ARGV) {}
    opts.parse!(args)

    # Logic goes here.
    # The following is enough for this question
    String.new(options[:file])
  end
end

可以运行rake local:file -- --file=/this/is/a/file.ext

执行任务

现在我想用RSpec验证是否创建了一个新字符串,但我不知道如何在规范中传递文件选项。

这是我的规格

require 'rake'

RSpec.describe 'local:file' do

  before do
    load File.expand_path("../../../tasks/file.rake", __FILE__)
    Rake::Task.define_task(:environment)
  end

  it "creates a string" do
     expect(String).to receive(:new).with('zzzz')
     Rake.application.invoke_task ("process:local_file")
  end
end

正确的我

#<String (class)> received :new with unexpected arguments
         expected: ("zzzz")
              got: (nil)

但如果我尝试

Rake.application.invoke_task ("process:local_file -- --file=zzzz")

我得到了

Don't know how to build task 'process:local_file -- --file=zzzz' (see --tasks)

我还尝试了Rake::Task["process:local_file"].invoke('--file=zzzz'),但仍然got: (nil)

我应该如何通过规范中的选项?

由于

1 个答案:

答案 0 :(得分:2)

鉴于您从ARGV(包含传递给脚本的参数的数组)获取选项:

args = opts.order!(ARGV) {}

您可以在调用Rake :: Task。

之前将ARGV设置为包含您想要的任何选项

对我来说(ruby 1.9.3,rails 3.2,rspec 3.4)类似于以下作品

argv = %W( local:file -- --file=zzzz )
stub_const("ARGV", argv)
expect(String).to receive(:new).with('zzzz')
Rake::Task['local.file'].invoke()

(按照惯例,ARGV [0]是脚本的名称。)