我想测试对用户输入的响应。使用Highline:
查询该输入def get_name
return HighLine.new.ask("What is your name?")
end
我想做一些与this question类似的事情并将其放入我的测试中:
STDOUT.should_receive(:puts).with("What is your name?")
STDIN.should_receive(:read).and_return("Inigo Montoya")
MyClass.new.get_name.should == "Inigo Montoya"
使用Highline执行此操作的正确方法是什么?
答案 0 :(得分:9)
了解如何测试Highline的最佳方法是查看作者如何测试他的包。
class TestHighLine < Test::Unit::TestCase
def setup
@input = StringIO.new
@output = StringIO.new
@terminal = HighLine.new(@input, @output)..
end
..
def test_agree
@input << "y\nyes\nYES\nHell no!\nNo\n"
@input.rewind
assert_equal(true, @terminal.agree("Yes or no? "))
assert_equal(true, @terminal.agree("Yes or no? "))
assert_equal(true, @terminal.agree("Yes or no? "))
assert_equal(false, @terminal.agree("Yes or no? "))
....
@input.truncate(@input.rewind)
@input << "yellow"
@input.rewind
assert_equal(true, @terminal.agree("Yes or no? ", :getc))
end
def test_ask
name = "James Edward Gray II"
@input << name << "\n"
@input.rewind
assert_equal(name, @terminal.ask("What is your name? "))
....
assert_raise(EOFError) { @terminal.ask("Any input left? ") }
end
等,如他的代码所示。您可以在highline source中找到此信息,密切关注我在链接中突出显示的设置。
请注意他如何使用STDIN IO管道在键盘上键入键盘的位置。
这表明,实际上,您不需要使用highline
来测试那种事情。他的测试中的设置非常关键。随着他使用StringIO
作为对象。
答案 1 :(得分:1)
Highline已经拥有自己的测试,以确保它输出到STDOUT并从STDIN读取。没有理由编写这些类型的测试。这与您不会编写ActiveRecord测试的原因相同,这些测试确保可以保存属性并从数据库中读取。
...然而 如果Highline的框架与Capybara的Web表格类似,那么它将非常有用...... 实际上从UI驱动输入并测试命令行实用程序逻辑的东西。
例如,以下类型的假设测试会很好:
run 'my_utility.rb'
highline.should :show_menu
select :add
highline.should(:ask).with_prompt("name?")
enter "John Doe"
output.should == "created new user"
答案 2 :(得分:1)
我发布了HighLine :: Test - 它允许您在一个进程中运行测试,而在另一个进程中运行您的应用程序(与使用Selenium进行基于浏览器的测试的方式相同)。
答案 3 :(得分:1)
我在这个DSL上尝试解决这个问题:
https://github.com/bonzofenix/cancun
require 'spec_helper'
describe Foo do
include Cancun::Highline
before { init_highline_test }
describe '#hello' do
it 'says hello correctly' do
execute do
Foo.new.salute
end.and_type 'bonzo'
expect(output).to include('Hi bonzo')
end