嗨!对于以下Ruby方法,如何在不重写方法的情况下使用RSpec测试来模拟用户输入?
def capture_name
puts "What is your name?"
gets.chomp
end
我找到a similar question,但这种方法需要使用类创建。 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
答案 0 :(得分: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