如何在传递参数时测试rake任务

时间:2017-11-20 11:21:51

标签: ruby-on-rails ruby rspec

我在传递参数时测试rake任务,我正在尝试运行像这样的rake任务

rake do_something_after_n_number_of_days 30

当我跑

let(:task) { Rake::Task['do_something_after_n_number_of_days'] }

task.invoke(30)

我得到ARGV [1]为零,但是当我在shell中运行rake任务时它工作正常。

我已查看过这些答案1 2,但他们都描述了这种方法

rake do_something_after_n_number_of_days[30]我可以使用test.invoke(30)测试它,但在某些shell中我必须像这样逃避括号 rake do_something_after_n_number_of_days\[30\]

1 个答案:

答案 0 :(得分:2)

在命令中使用环境变量进行配置的常见做法。你会在很多不同的宝石中看到这个。根据您的需要,您可以做同样的事情:

task :do_something_after_n_number_of_days do
  raise ArgumentError, 'Invalid DAYS environment setting' if ENV['DAYS'].nil?
  puts ENV['DAYS']
end

然后您可以在测试中设置ENV,如下所示:

let(:task) { Rake::Task['do_something_after_n_number_of_days'] }

context "when DAYS is set" do 
  before { ENV['DAYS'] = '100' }

  it "does something" do 
    expect { task.invoke }.to output("100").to_stdout
  end
end

context "when DAYS is nil" do 
  before { ENV['DAYS'] = nil }

  it "raises an ArgumentError" do 
    expect { task.invoke }.to raise_error(ArgumentError, /Invalid DAYS/)
  end
end