热测试 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
如何在 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