Faking the console in Ruby
A few days ago, I was preparing an assignment for a job process both in Java and in Ruby. While doing in Java, I decided to test the engine. But in Ruby I wanted to test the whole application, including the communication via standard input/output on the console.
And how do you mock standard input/output in Ruby?. Well. It turns out it is quite easy to do it with Rspec. But I wanted to do it without any additional requirement. How do you mock STDIN and STDOUT in plain Ruby.
It turns out it isn’t difficult. Based on this gist, I prepared my own solution. First the input faker:
class InputFaker
def feedStrings(strings)
@strings = strings
end
def gets
next_string = @strings.shift
next_string #TODO: I guess next_string is superflous
end
end
Second the output faker
class OutputFaker
def initialize
@result=[]
end
def write(str)
@result << str.chomp
end
def clear
@result=[]
end
def result
@result.join
end
end
Third, setup and teardown methods
def setup
$stdin = InputFaker.new
$stdout = OutputFaker.new
@robotUI=RobotUI.new unless @robotUI
end
def teardown
$stdin = STDIN
$stdout = STDOUT
end
And fourth, the actual use (in this case a test)
def actual_test(array_of_inputs,expected_output)
$stdin.feedStrings(array_of_inputs)
array_of_inputs.size.times{@robotUI.parse()}
assert_equal(expected_output,$stdout.result)
end
First published here