Ruby 如何为GET多次模拟用户输入
我的UI基于控制台和case/when。我想为代码编写一些RSpec。这是我的一段代码: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
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,而不是非常红宝石。您可能希望返回对象(如创建的帐户)或引发异常。这有助于简化流量控制。