ruby控制台应用程序的端到端测试

ruby控制台应用程序的端到端测试,ruby,Ruby,我有一个ruby控制台应用程序,你运行时带一个参数,然后一旦运行,就会向屏幕输出一些文本,请求更多的用户输入,然后向屏幕输出更多的文本。我想在这个应用上做一个端到端的测试,我不知道怎么做。如果我正在为RESTAPI编写端到端测试,我只需点击公共端点,遵循链接,然后在输出上有一个expect语句。容易的。但在控制台应用程序上,我不知道如何做同样的事情。在测试环境中单步执行控制台应用程序有什么好处吗?我找了一整天,但什么也没找到 非常感谢您的帮助。受其启发,我编写了一个方法,可以捕获控制台输入和输出

我有一个ruby控制台应用程序,你运行时带一个参数,然后一旦运行,就会向屏幕输出一些文本,请求更多的用户输入,然后向屏幕输出更多的文本。我想在这个应用上做一个端到端的测试,我不知道怎么做。如果我正在为RESTAPI编写端到端测试,我只需点击公共端点,遵循链接,然后在输出上有一个expect语句。容易的。但在控制台应用程序上,我不知道如何做同样的事情。在测试环境中单步执行控制台应用程序有什么好处吗?我找了一整天,但什么也没找到

非常感谢您的帮助。

受其启发,我编写了一个方法,可以捕获控制台输入和输出,因此可以在测试中使用:

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\u input
参数中指定的字符串值作为输入

基本用法 下面是
emulate\u控制台
方法的简单用法:

out = emulate_console("abc\n") do
  input = gets.chomp
  puts "You entered: #{input}!"
end
返回值
out
是一个对象。要访问其值,请使用:

请注意,输入包含一个换行符(
\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
要求“rspec/autorun”
RSpec.description'#console_add_number'do
它“计算正确的结果”做什么
输入=这可能有助于:
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