【问题标题】:How do I write an RSpec test for a Ruby method that contains "gets.chomp"? [duplicate]如何为包含“gets.chomp”的 Ruby 方法编写 RSpec 测试? [复制]
【发布时间】:2013-06-23 07:38:28
【问题描述】:

挑战

嗨!对于以下 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

【问题讨论】:

标签: ruby rspec


【解决方案1】:

您可以像这样删除标准输入流:

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

【讨论】:

  • 谢谢!很有帮助。
猜你喜欢
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
相关资源
最近更新 更多