ruby - 用一个期望测试自定义异常?

标签 ruby rspec rubocop

我有一个我想测试的函数在输入时引发异常,但该异常还包含一些比普通消息更多的信息,我也想测试它。所以我做了这样的事情as seen in the rspec documentation :

it 'raises the correct exception' do
   expect { my_call }.to raise_error do |error|
     expect(error.some_field).to eq('some data')
   end
end

这很好用,但是它与 RSpec/MultipleExpectations 冲突:

RSpec/MultipleExpectations: Example has too many expectations [2/1]

据我所知,如果没有超过一个期望值,就不可能像这样以 block 形式使用 raise_error,那么是什么原因呢?有没有办法以某种方式将引发的异常保存在示例之外,以便我可以正常规范它,而无需在规范中做一些涉及 rescue 的可怕事情?或者我应该使用自定义 raise_custom_error 匹配器?

最佳答案

Rubocop 默认情况下,我认为会启用您看到的警告,其中表示每个 it block 中只有一个 expect。您可以通过添加以下内容在 rubocop.yml 中禁用此功能:

# Disables "Too many expectations."
RSpec/MultipleExpectations:
  Enabled: false

或者如果你只想为你的特定规范禁用它,你可以通过添加这样的注释来实现,注意你可以通过在注释中使用规则名称来禁用任何 rubocop 规则:

# rubocop:disable RSpec/MultipleExpectations
it 'raises the correct exception' do
  expect { my_call }.to raise_error do |error|
    expect(error.some_field).to eq('some data')
  end
end
# rubocop:enable RSpec/MultipleExpectations

it 'does something else' do
  expect(true).to be true
end

更多 rubocop 语法选项 see this answer

关于ruby - 用一个期望测试自定义异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55545389/

相关文章:

ruby-on-rails - 等同于 Rails 的 Django 信号?

ruby-on-rails - 禁用 Rails 中的单元测试生成器

Rubocop 不忽略 db/schema.rb 文件

ruby - Rubocop 进攻 : Use the return of the conditional for variable assignment and comparison

ruby-on-rails - RuboCop:不同目录的不同参数

ruby - 我怎样才能获得为我的 Ruby 程序重命名文件的权限?

Ruby:奇怪地使用 "?"运算符比较字符串是否相等

ruby-on-rails - Rails with PostgreSQL 每个请求重新连接多次

ruby-on-rails - Capybara、Devise、CanCan 和 RSpec 集成测试 : valid sign in 302 redirects to example. com

ruby-on-rails - FactoryGirl 的 RSpec 测试失败,隔离时通过