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

pop*_*nja 8 ruby rspec

挑战

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

def capture_name
  puts "What is your name?"
  gets.chomp
end
Run Code Online (Sandbox Code Playgroud)

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

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

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

def capture_name(user_input = gets.chomp)
  puts "What is your name?"
  user_input
end
Run Code Online (Sandbox Code Playgroud)

现在我可以写一个像这样的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
Run Code Online (Sandbox Code Playgroud)

Vic*_*gin 22

你可以像这样存根标准输入流:

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
Run Code Online (Sandbox Code Playgroud)