我是红宝石新手,我设法提取了红宝石代码,但是为它们编写rspec似乎有问题。即使阅读了很少的教程,也很难理解编写rspec的方式。有人可以帮我写一个输入法,然后我会尝试重构其余的输入法。
RB文件:
module RubyOperations
class Operations
def input(num)
RubyOperations.log('Enter a number:[Between 1 to 10]',:BOTH)
num = Integer(gets.chomp)
raise StandardError if num <= 0 || num > 10
return num
rescue StandardError, ArgumentError => e
RubyOperations.log(e,:ERROR)
end
end
end
RSPEC:
describe 'RubyOperations' do
describe 'Operations' do
describe '.input' do
context 'when number is provided' do
it 'returns the number provided' do
expect(RubyOperations.input(num)).to eq(Integer)
end
end
end
end
end
答案 0 :(得分:0)
您可以检查方法输出的类是否等于整数
require 'ruby_final_operations'
describe 'RubyOperations' do
describe 'Operations' do
describe '.input' do
context 'when number is provided' do
it 'returns the number provided' do
expect(RubyOperations.input(num).class).to eq(Integer)
(or)
expect(RubyOperations.input(num)).to be_a_kind_of(Integer)
end
end
end
end
end
每当编写rspec时,请记住
如果您要为其编写rspec的方法可以处理数据库中的操作,则请检查数据库是否被操作
或者,如果您正在为返回对象的任何方法编写rspec,则按以下步骤操作
如果定义的方法类似
def square_of_a_number(num)
num*num
end
然后像这样写rspec
it 'returns square of a number' do
expect(square_of_a_number(2).to eq(4)
end
对于您知道方法输出的任何方法,然后将输入或用户Faker gem硬编码为该方法的输入,以期望该方法的预期结果
答案 1 :(得分:0)
您共享的代码很少有问题:
1)在Operations
类中,方法input
接收到一个由于以下原因而在任何地方都不使用的参数:num = Integer(gets.chomp)
。基本上gets
是等待用户输入的方法,而赋值num = ...
会覆盖传递给该方法的参数(num
)的值,因此传递{{ 1}}参数作为方法。
2)在规范样本中,您在num
模块上调用input
方法,而RubyOperations
位于命名空间input
下的类Operations
中。同样,方法RubyOperations
不是类方法,而是实例方法。因此正确的方法调用将是:input
3)要运行RubyOperations::Operations.new.input(5)
方法的规范,您需要对用户输入进行存根。 RSpec-mocks gem可以帮助您-https://github.com/rspec/rspec-mocks。它具有input
存根方法:allow
整个样本将是:
allow(object).to receive(:gets) { "5" }