RSpec 3:期望 object.do_something 不会引发特定类型的错误

RSpec 3: expect object.do_something to NOT raise a particular kind of error

我想测试一个特定方法是否不会引发 class AError 错误。它可以引发 BError、ArgumentError、几乎任何其他类型的错误,或者没有错误,只是不是 AError。是否有任何未弃用的(从 RSpec 3 开始)的方法来做到这一点?

我试过了

expect { object.do_something }.not_to raise_error(AError)

但我明白了

ArgumentError:
   `expect { }.not_to raise_error(SpecificErrorClass)` is not valid,
    use `expect { }.not_to raise_error` (with no args) instead

无参数方法的问题是测试会因任何类型的错误而失败,而它应该传递除 AError 之外的任何错误。

此文档似乎没有帮助:https://www.relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/raise-error-matcher

好像老版本的RSpec有办法处理这种情况,不明白新版本的RSpec是怎么回事

所以我很困惑。谢谢。

您可以在此处阅读有关为何删除此内容的讨论https://github.com/rspec/rspec-expectations/issues/231

如果您真的必须测试这种情况,您可以采用不同的方式:

begin
  object.do_something
rescue StandardError => e
  # expect e to not be AError
end

这个特定的语法解决了问题:

it 'do_something does not raise AError' do
  begin
    expect { object.do_something }.not_to raise_error
  rescue RSpec::Expectations::ExpectationNotMetError => e
    expect(e.message).not_to include 'AError'
  end
end