ruby中的后引号在单独的进程中运行命令。当您测试
我有一个collector.rb
文件,里面有这样的东西:
class Collector
def initialize(input)
raise ArgumentError, 'must be positive integer' unless input.to_i.positive?
end
# more code...
end
begin
Collector.new(*ARGV).do_something
rescue ArgumentError => e
warn e.message
end
所以当我在终端中执行$ ruby collector.rb
时,我从Ruby文档中得到了预期的wrong number of arguments (given 0, expected 1)
在我的测试文件中,我有:
require 'rspec'
require './collector'
RSpec.describe Collector do
let(:exec) { File.expand_path('../collector.rb', File.dirname(__FILE__)) }
describe 'input in console' do
context 'when wrong number of arguments' do
specify { expect {`ruby #{exec} `}.to output('wrong number of arguments (given 0, expected 1)').to_stderr }
end
end
end
目前,我的测试失败了,因为它无法检测到STDERR
的任何输出,尽管我遵循这里的建议请问我做错了什么我很乐意得到任何关于如何修复代码的提示。
to_output...to_stderr
时,您将在父进程(RSpec(上测试它,而不是在子进程(ruby(上测试。
为了测试子进程stderr,可以使用Open3.popen3
来访问进程stderr。
试试这样的东西(未经测试(:
require 'open3'
specify do
Open3.popen3("ruby #{exec}") do |_stdin, _stdout, stderr|
expect(stderr.read.strip).to eq('wrong number of arguments (given 0, expected 1)')
end
end