Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何为GET多次模拟用户输入_Ruby_Rspec - Fatal编程技术网

Ruby 如何为GET多次模拟用户输入

Ruby 如何为GET多次模拟用户输入,ruby,rspec,Ruby,Rspec,我的UI基于控制台和case/when。我想为代码编写一些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 dupl

我的UI基于控制台和case/when。我想为代码编写一些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,那么它将传递名称和密码?

好的,gets是内核模块中定义的一个方法,它包含在你的类中,所以你可以像这样模拟它:

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
我假设你的选择是。。。代码在方法\u中,方法\u执行\u任务


有些人认为模拟测试对象是一种代码味道,虽然我找不到任何描述这种味道的链接,但我肯定我在什么地方读过它。

Ruby强烈支持变量和方法名称的snake_案例命名约定,即create_account而不是createAccount。原因是露比是区分大小写的,大写字母表示CaskNoD或常量之类的代价。另一个要考虑的是,返回像-1那样的错误代码非常C,而不是非常红宝石。您可能希望返回对象(如创建的帐户)或引发异常。这有助于简化流量控制。