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

时间:2014-11-17 09:16:05

标签: ruby

我有一个ruby控制台应用程序,你用一个参数运行,然后一旦运行输出一些文本到屏幕,要求更多的用户输入,然后输出更多的文本到屏幕上。我想在这个应用程序上做一个结束测试,我不知道如何。如果我正在为REST API编写端到端测试,我只需点击公共端点,按照链接然后在输出上有一个expect语句。简单。但在控制台应用程序上,我不知道如何做同样的事情。在测试环境中是否有任何宝石可以通过控制台应用程序进行操作?我整天都在寻找但却找不到任何东西。

任何帮助表示赞赏。

1 个答案:

答案 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

返回值outStringIO个对象。要访问其值,请使用#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