【问题标题】:Rspec raise matcher not working, copied syntax from docs?Rspec引发匹配器不起作用,从文档中复制语法?
【发布时间】:2021-04-04 21:13:58
【问题描述】:
rspec-core (3.9.1)
rspec-expectations (3.9.0)
rspec-mocks (3.9.1)
rspec-rails (4.0.0.beta4, 3.9.0)
rspec-support (3.9.2)

根据文档:https://relishapp.com/rspec/rspec-expectations/v/3-9/docs/built-in-matchers/raise-error-matcher,这应该可以:

expect { raise StandardError }.to raise_error

然而在我的代码中,当我自己运行该规范时,我得到:

Failures:

  1) time rules should work
     Failure/Error: expect(raise StandardError).to raise_error
     
     StandardError:
       StandardError
     # ./spec/models/time_rules_spec.rb:87:in `block (2 levels) in <top (required)>'

【问题讨论】:

  • 对我有用,我不记得这个匹配器有问题。也许您可以在没有其他宝石的新项目上使用它?

标签: ruby-on-rails testing rspec rspec-rails


【解决方案1】:

仔细查看错误:

Failure/Error: expect(raise StandardError).to raise_error

这表明您的失败测试如下所示:

it '...' do
  expect(raise StandardError).to raise_error
end

什么时候应该是这样的:

it '...' do
  expect { raise StandardError }.to raise_error
end

你的版本相当于:

result = raise StandardError
expect(result).to raise_error

所以在raise_error 可以捕获并检查异常之前触发raise。如果您按照文档中的方式将块传递给expect

expect { raise StandardError }.to raise_error

然后raise_error 匹配器将设置所有内容以捕获并检查异常。


顺便说一句,您可能希望更明确地使用 raise_error 匹配器:

expect { raise StandardError }.to raise_error(StandardError)

为了避免过于宽泛的匹配器和这样的警告:

警告:在不提供特定错误或消息的情况下使用 raise_error 匹配器可能会出现误报,因为当 Ruby 引发 NoMethodErrorNameErrorArgumentError 时,raise_error 将匹配,这可能会导致期望通过甚至不执行您打算调用的方法。

【讨论】:

    猜你喜欢
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多