测试进入rspec(用户输入)

时间:2018-11-28 19:56:32

标签: ruby rspec mocking

我的班级有一个#run方法,到目前为止,它只是测试测试:

def run
    puts "Enter 'class' to create a new class."
    input = $stdin.gets.chomp
    binding.pry

到目前为止,在测试中我已经获得

  allow($stdin).to receive(:gets).and_return 'class'
  cli.run

通过这种方式,我可以在窥探会话中看到input已按照预期设置为'class'

有没有一种方法可以在我的方法本身对$stdin的调用中不添加gets?即input = gets.chomp

我已经尝试过allow(cli.run).to receive(:gets).and_return 'class' 但随后在撬动会话中,input等于spec文件的第一行!

1 个答案:

答案 0 :(得分:1)

您可以避免这种情况:

def run
  puts "Enter 'class' to create a new class."
  input = gets.chomp
end

describe 'gets' do 
  it 'belongs to Kernel' do 
    allow_any_instance_of(Kernel).to receive(:gets).and_return('class')
    expect(run).to eq('class')
  end
end

方法gets实际上属于Kernel模块。 (method(:gets).owner == Kernel)。由于Kernel中包含Object,几乎所有的ruby对象都从Object继承,因此可以使用。

现在,如果runClass范围内的实例方法,我建议对存根进行更多的范围界定,以使:

class Test
  def run
    puts "Enter 'class' to create a new class."
    input = gets.chomp
  end
end

describe 'gets' do 
  it 'can be stubbed lower than that' do 
    allow_any_instance_of(Test).to receive(:gets).and_return('class')
    expect(Test.new.run).to eq('class')
  end
  # or even 
  it 'or even lower than that' do 
    cli = Test.new
    allow(cli).to receive(:gets).and_return('class')
    expect(cli.run).to eq('class')
  end
end

Example