rspec:raise_error用法以匹配错误消息

use*_*365 8 ruby rspec

我提出错误使用 raise(ConfigurationError.new(msg))

我尝试用rspec测试这个:

expect {
  Base.configuration.username
}.to raise_error(ConfigurationError, message) 
Run Code Online (Sandbox Code Playgroud)

但这不起作用.我该怎么测试呢?目标是匹配message.

hlc*_*lcs 14

您可以将错误消息与正则表达式匹配:

it { expect{ Foo.bar }.to raise_error(NoMethodError, /private/) }
Run Code Online (Sandbox Code Playgroud)

这将检查是否NoMethodError引发了private method消息而不是undefined method.

将是有用的,因为NoMethodError.new即使使用相同的错误消息也没有通过测试.

  • 这应该是公认的答案:) (2认同)

Jas*_*ase 9

另一种解决方案是使用一个块,您可以在其中断言 的各种属性|error|。使用原始问题中的名称:

expect { Base.configuration.username }
      .to(raise_error do |error|
        expect(error).to be_a(ConfigurationError)
        expect(error.message).to eq 'My configuration message'
      end)
Run Code Online (Sandbox Code Playgroud)


neo*_*jin 6

确保使用rspec> 2.14.0并查看此提交:

https://github.com/rspec/rspec-expectations/commit/7f02b503d5ae48d1141b6465acd0a7a4e1bb84dd

it "passes if an error instance is expected" do
  s = StandardError.new
  expect {raise s}.to raise_error(s)
end
Run Code Online (Sandbox Code Playgroud)

  • 这不能回答张贴者想要匹配错误消息本身的问题 (5认同)
  • 这不是答案 (2认同)