我想检查数字除以0是否会从下面的方法中提高ZeroDivisionError
def progress_percent
(activity_reads.size / journey.cms_activity_ids.size.to_f)
rescue ZeroDivisionError
0
end
我的规格是:
context 'when journey does not have activity' do
let!(:activity_read) { ['test', 'test'] }
let(:journey) { build(:journey, :without_activity) }
it 'raise the ZeroDivisionError' do
expect { call }.to raise_error(ZeroDivisionError)
end
end
当我将binding.pry
设置为progress_percent方法时,我得到了预期的结果,activity_read = 2
和journey.cms_activity_ids.size.to_f = 0
却出现了错误:
Failure/Error: expect { call }.to raise_error(ZeroDivisionError)
expected ZeroDivisionError but nothing was raised
编辑:
这是更大班级的一部分
def call
Progres.update(
user_id: current_user.id,
percent_progress: progress_percent,
)
end
private
def progress_percent
(activity_reads.size / journey.cms_activity_ids.size.to_f)
rescue ZeroDivisionError
0
end
答案 0 :(得分:1)
如Spickermann所说,如果您正在处理错误,则无需测试。
您应该做的是确认在这种情况下该方法返回0
。
话虽如此...您将journey.cms_activity_ids.size
转换为浮点数,因此无论如何都不会引发错误。除以0.0将得到Infinity
的结果,而不是引发错误。
您可以使用...测试无穷大。
expect(subject.send(:progress_percent)).to eq BigDecimal('Infinity')
如果非零分子为负,并且分母为零,则将得到负无穷大。用...进行测试...
expect(subject.send(:progress_percent)).to eq BigDecimal('-Infinity')
但是请注意,如果您有一个“负零”,则略有不同:-1.0 / -0.0
返回无穷大,而不是负无穷大。
如果分子和分母均为零,且至少一个为浮点数,则将返回NaN
。用...进行测试...
expect(subject.send(:progress_percent).nan?).to be true
NaN
从不等于任何事物,甚至不等于任何NaN
答案 1 :(得分:1)
为什么不早退呢?:
def progress_percent
return 0 unless journey.cms_activity_ids.size > 0
activity_reads.size / journey.cms_activity_ids.size
end
此外,您无需强制转换为浮点数或整数,“ assoc_ids” AR方法将返回一个对:size
进行响应的对象
答案 2 :(得分:0)
call
不会引发它,因为您可以捕捉/救援它。
expect(call).to eq(0)
应该通过。