ruby-on-rails - 如何测试 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
解决方案
我想到了!
最终为我工作的语法是这样的:
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
方法是否继续创建某个对象。
推荐阅读
- c++ - [window terminal][vim] 光标不移动,输入在右箭头或回车前重叠
- laravel - 获取在其他集合中有关系的模型
- javascript - 在滚动功能中显示 Ajax 调用之前的加载
- python - 如何为未登录的时间戳添加 NA 值?自动化工资单和生成工资单
- django - DB 被 Django App 中的后台周期性任务压得喘不过气来
- reactjs - React 上下文和组件测试
- yocto - 使用 conf 文件为多台机器构建相同的图像
- java - scheduleAtFixRate 每 10 分钟运行一次,而不是每小时运行一次
- spring-boot - 为 spring-security-taglibs 添加依赖会抛出由 org.springframework.beans.factory.BeanCreationException 引起的 javax.servlet.ServletException
- android - RecyclerView - 使用键盘过滤项目,如 ListView