【发布时间】:2019-06-15 06:00:24
【问题描述】:
我有一个方法可以记录对数据库中特定记录的更改,但首先,它会在继续之前检查类别类型的有效性。如果返回 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
【问题讨论】:
-
看起来错误没有被
expect { change }拦截...你能显示模型回调(如何调用valid_category?)和整个rspec caseq -
我更新了更详尽的示例。
-
Bronze和bronze不一样。那么CATEGORIES呢?可能问题是该数组包含您的类别吗? -
@mechnicov 我忘了包括我在 UpgradePackageRecorder 中有一个方法,当它们到达那里时,它会降低所有类别。另外,我仔细检查了类别数组不包括“青铜”。
标签: ruby-on-rails ruby unit-testing error-handling rspec