如何多次模拟用户输入获取

时间:2017-10-01 15:14:11

标签: ruby rspec

我在控制台和case/when上创建了我的UI。我想为代码编写一些rspec。这是我的一段代码:

case choice
when '1' #Create account
  puts 'Enter username:'
  username = gets.chomp
  puts 'Enter Password'
  password = gets.chomp
  #createAccount() returns 1 or -1 after checking the database for duplicates
  operation = System.createAccount(username, password) 
  if operation == -1
    puts 'Error!'
  else
    puts 'Success!'
  end
when '2' #login case
  #code omitted
end

我必须通过gets.chomp操作。我找到了各种建议,比如使用allow方法来解决它:

STDIN.stub(:gets).and_return('name')
STDIN.stub(:gets).and_return('password')

但这并没有帮助;运行rspec测试并不允许代码超过username = gets.chomp

你有什么建议我应该如何编写规范(我想测试操作值是否为1)以便它通过name然后传递password

1 个答案:

答案 0 :(得分:1)

好吧,getsKernel模块中定义的一个方法,它包含在你的类中(混合在一起),所以你可以像这样嘲笑它:

describe do 
  subject { described_class.new }
  before do 
    allow(subject).to receive(:gets).and_return('name', 'password')
    # https://relishapp.com/rspec/rspec-mocks/v/3-6/docs/configuring-responses/returning-a-value#specify-different-return-values-for-multiple-calls 
  end

  specify do
    expect(System).to receive(:createAccount).with('name', 'password')
    subject.method_that_does_the_job
  end
end

(我假设您的case choice...代码位于method_that_does_the_job

有些人认为模拟测试对象是一种代码气味(虽然我找不到任何描述它的链接,但我确定我已经在某处读过它。)