首页 > 解决方案 > 如何测试 RuntimeError 在 Ruby 中正确使用字符串插值?

问题描述

我有一种方法可以记录对数据库中特定记录的更改,但首先,它会在继续之前检查类别类型的有效性。如果这返回 false,则会引发错误。

class UpgradePackageRecorder

  CATEGORIES = [ an array of categories here ... ]

  def initialize(category)
    @category = category
  end

  def record_change
    unless valid_category?
      raise "#{category} is not a recognized category"
    end

    other_methods
  end

  private

  def valid_category?
    CATEGORIES.include?(category)
  end

end

我开始为此编写一个 rspec 测试,以验证错误是否正确引发。这是测试用例:

RSpec.describe UpgradePackageRecorder do
  describe '#record_change' do
    context 'the package type is invalid' do
      it 'raises an error' do

       recorder = UpgradePackageRecorder.new('Bronze')

       expect { recorder.record_change }.to raise_error(RuntimeError, /bronze is not a recognized category/)
      end
    end
  end
end

当我运行测试时,我得到了这个错误:

Failure/Error: raise "#{category} is not a recognized category"

RuntimeError:
  bronze is not a recognized category

为什么字符串插值会这样显示?我也尝试过, category + ' is not a recognized category但这并没有解决问题。

为了使这更加混乱,我取出字符串插值并仍然看到问题:

Failure/Error: raise "Unrecognized category"

RuntimeError:
  Unrecognized category

标签: ruby-on-railsrubyunit-testingerror-handlingrspec

解决方案


我想到了!

最终为我工作的语法是这样的:

it 'raises an error' do

  expect do
    UpgradePackageRecorder.new(
      'Bronze'
    ).record_change
  end.to raise_error(
    RuntimeError, /bronze is not a recognized category/
  )

end

此外,我在我删除expect的同一块中有另一个。it它正在验证该record_change方法是否继续创建某个对象。


推荐阅读