【问题标题】:RSpec how to exception of raising error - expected ZeroDivisionError but nothing was raisedRSpec如何引发错误的异常 - 预期ZeroDivisionError但没有引发
【发布时间】:2020-07-17 17:53:57
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案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

      话虽如此...您正在将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 返回 Infinity,而不是负 Infinity。

      如果分子和分母都为零并且至少有一个是浮点数,您将返回NaN。用...进行测试

      expect(subject.send(:progress_percent).nan?).to be true
      

      NaN 永远不等于任何东西,甚至不等于另一个 NaN

      【讨论】:

      • 最后它给了我Infinity 或 NaN - 如何编写测试来显示这样的结果?
      • 编辑了我的答案以解决您的问题。
      【解决方案3】:

      它不是由call 提出的,因为你抓住/拯救了它。

      expect(call).to eq(0)
      

      应该会通过。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-28
        • 1970-01-01
        相关资源
        最近更新 更多