受this gem 的启发,它有一个相当简单的implementation,我编写了一个捕获控制台输入和输出的方法,因此可以用于测试:
require 'stringio'
module Kernel
def emulate_console(console_input)
$stdin = StringIO.new(console_input)
out = StringIO.new
$stdout = out
yield
return out
ensure
$stdout = STDOUT
$stdin = STDIN
end
end
此方法捕获控制台输出,并提供您在console_input 参数中指定的字符串值作为输入。
基本用法
下面是emulate_console方法的简单用法:
out = emulate_console("abc\n") do
input = gets.chomp
puts "You entered: #{input}!"
end
返回值out 是一个StringIO 对象。要访问其值,请使用#string method:
out.string
=> "You entered: abc!\n"
请注意,输入包含换行符 (\n) 以模拟按下 ENTER 键。
测试
现在,假设您要测试这个方法,它同时使用标准输入和标准输出:
def console_add_numbers
x = Integer(gets)
y = Integer(gets)
puts x + y
end
以下 RSpec 测试测试此代码的快乐路径:
require 'rspec/autorun'
RSpec.describe '#console_add_numbers' do
it 'computes correct result' do
input = <<-EOS
2
3
EOS
output = emulate_console(input) { console_add_numbers }
expect(output.string.chomp).to eql '5'
end
end