我在控制台和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
?
答案 0 :(得分:1)
好吧,gets
是Kernel
模块中定义的一个方法,它包含在你的类中(混合在一起),所以你可以像这样嘲笑它:
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
)
有些人认为模拟测试对象是一种代码气味(虽然我找不到任何描述它的链接,但我确定我已经在某处读过它。)