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