热测试 ruby 脚本 rspec

Hot to test ruby script with rspec

如何在 RSpec 测试中 run/test ruby 脚本?

调用脚本的测试参数的简单示例

# frozen_string_literal: true

begin
  raise Errors::NoArgumentError                 if ARGV.count.zero?
rescue Errors => e
  puts e.message
  abort
end

file  = File.open(ARGV[0], 'r')
# Do something with file...

我尝试测试:

  it 'should throw no argument error' do
    expect {
     load('bin/script.rb') # Or system()
    }.to raise_error(Errors::NoArgumentError)
  end

我建议将脚本和应用程序代码拆分到两个不同的文件中,这将使测试更容易,因为您不需要加载文件并且可以轻松地注入参数。

# script.rb
exit(Cli.run(ARGV)

然后有一个 Cli class 可以调用

# cli.rb
class Cli
  def self.run(args)
    new(args).run
  end

  def initialize(args)
    @args = args
  end

  def run
    raise Errors::NoArgumentError if @args.count.zero?
    File.open(@args[0], 'r')
    0 # exit code
  rescue Errors => e
    puts e.message
    1 # exit code
  end
end

然后你可以很容易地测试这个

it 'should throw no argument error with no args provided' do
  expect {
    Cli.run([])
  }.to raise_error(Errors::NoArgumentError)
end

it 'should throw X if file does not exist' do
  expect {
    Cli.run(["not_existent"])
  }.to raise_error(Errors::NoArgumentError)
end