Ruby on Rails单元测试中如何正确断言异常消息?
如何在Rails测试中正确断言异常消息?
你遇到的问题是因为旧版本Rails(Rails 5及更早)的assert_raises方法不支持match参数,这个参数会被直接忽略,所以只要代码抛出了指定类型的异常,测试就会通过,不会校验消息内容。
以下是两种正确的实现方式:
方法一:捕获异常对象后单独断言(兼容性最好)
这种方式适用于所有Rails版本,先捕获抛出的异常实例,再用assert_match验证其消息内容:
require "test_helper" class QuizTest < ActiveSupport::TestCase test "error message" do # 捕获抛出的ArgumentError异常 exception = assert_raises(ArgumentError) do Quiz.oops() end # 断言异常消息包含预期内容 assert_match(/go away/, exception.message) end end
方法二:使用Rails 6+支持的match参数
如果你使用的是Rails 6或更高版本,可以直接通过match参数校验消息,但要确保参数传递正确:
require "test_helper" class QuizTest < ActiveSupport::TestCase test "error message" do assert_raises(ArgumentError, match: /go away/) do Quiz.oops() end end end
运行bin/rake test后,当异常消息不匹配正则时,测试会正确失败,符合预期。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

