如何为包含“gets.chomp”的Ruby方法编写RSpec测试?

挑战

嗨! 对于以下Ruby方法,如何在不重写方法的情况下使用RSpec测试来模拟用户输入?

def capture_name puts "What is your name?" gets.chomp end 

我发现了类似的问题 ,但这种方法需要使用类创建。 RSpec是否支持对不在类中的方法进行存根?

一个不同的作品,但我被迫重写方法

我可以重写方法,所以它有一个变量,默认值为“gets.chomp”,如下所示:

 def capture_name(user_input = gets.chomp) puts "What is your name?" user_input end 

现在我可以像这样写一个RSpec测试:

 describe "Capture name" do let(:user_input) { "James T. Kirk" } it "should be 'James T. Kirk'" do capture_name(user_input).should == "James T. Kirk" end end 

你可以像这样截取标准输入流:

 require 'stringio' def capture_name $stdin.gets.chomp end describe 'capture_name' do before do $stdin = StringIO.new("James T. Kirk\n") end after do $stdin = STDIN end it "should be 'James T. Kirk'" do expect(capture_name).to be == 'James T. Kirk' end end