我有一个ruby控制台应用程序,你用一个参数运行,然后一旦运行输出一些文本到屏幕,要求更多的用户输入,然后输出更多的文本到屏幕上。我想在这个应用程序上做一个结束测试,我不知道如何。如果我正在为REST API编写端到端测试,我只需点击公共端点,按照链接然后在输出上有一个expect语句。简单。但在控制台应用程序上,我不知道如何做同样的事情。在测试环境中是否有任何宝石可以通过控制台应用程序进行操作?我整天都在寻找但却找不到任何东西。
任何帮助表示赞赏。
答案 0 :(得分:0)
受到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 键。
现在,让我们假设你要测试这个使用stdin和stdout的方法:
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