rubyrspeciohighline

How can I test rspec user input and output with Highline?


I'd like to test response to user input. That input is queried using Highline:

def get_name
  return HighLine.new.ask("What is your name?")
end

I'd like to do something similar to this question and put it in my test:

STDOUT.should_receive(:puts).with("What is your name?")
STDIN.should_receive(:read).and_return("Inigo Montoya")
MyClass.new.get_name.should == "Inigo Montoya"

What is the correct way to do this with Highline?


Solution

  • The best way to find out how to test Highline is to see how the author tests his package.

    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
    

    Etc., as shown in his code. You can find this information in the highline source paying close attention to the setup, which I have highlighted in the link.

    Notice how he uses the STDIN IO pipe to act in the place of typing the keys on the keyboard.

    What this indicates, really, is that you don't need to use highline to test that kind of thing. The setup in his tests are really key here. Along with his use of StringIO as an object.