RSpec如何引发错误的异常-预期为ZeroDivisionError,但未引发任何异常

时间:2020-07-16 16:11:34

标签: ruby-on-rails ruby

我想检查数字除以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 = 2journey.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

3 个答案:

答案 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)

应该通过。