【问题标题】:end to end test of a ruby console appruby 控制台应用程序的端到端测试
【发布时间】:2014-11-17 09:16:05
【问题描述】:

我有一个 ruby​​ 控制台应用程序,您可以使用参数运行它,然后在运行后向屏幕输出一些文本,要求更多用户输入,然后向屏幕输出更多文本。我想对这个应用程序进行端到端测试,但我不知道如何。如果我正在为 REST API 编写端到端测试,我只需点击公共端点,点击链接,然后在输出中添加一个 expect 语句。简单的。但是在控制台应用程序上,我不知道如何做同样的事情。是否有任何宝石可以在测试环境中单步执行控制台应用程序?找了一天也没找到。

任何帮助表示赞赏。

【问题讨论】:

标签: ruby


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    • 2012-08-15
    • 2011-05-12
    • 2016-04-23
    • 2013-02-23
    • 1970-01-01
    相关资源
    最近更新 更多