【问题标题】:How to use RSpec's should_raise with any kind of exception?如何在任何异常情况下使用 RSpec 的 should_raise?
【发布时间】:2010-12-15 22:00:28
【问题描述】:

我想做这样的事情:

some_method.should_raise <any kind of exception, I don't care>

我应该怎么做?

some_method.should_raise exception

...不起作用。

【问题讨论】:

    标签: ruby-on-rails ruby exception-handling rspec


    【解决方案1】:

    从 3.3 版开始,rspec-expections gem 针对没有参数的空白 raise_error 引发警告

    expect { raise StandardError }.to raise_error # results in warning
    expect { raise StandardError }.to raise_error(StandardError) # fine
    

    这会提示您的代码可能会因与要检查的测试不同的错误而失败。

    警告:在不提供特定错误或消息的情况下使用 raise_error 匹配器可能会导致误报,因为当 Ruby 引发 NoMethodErrorNameErrorArgumentError 时,raise_error 将匹配,这可能会导致期望通过甚至不执行您打算调用的方法。而是考虑提供特定的错误类别或消息。可以通过设置来抑制此消息:RSpec::Expectations.configuration.warn_about_potential_false_positives = false

    【讨论】:

      【解决方案2】:

      RSpec 2

      expect { some_method }.to raise_error
      expect { some_method }.to raise_error(SomeError)
      expect { some_method }.to raise_error("oops")
      expect { some_method }.to raise_error(/oops/)
      expect { some_method }.to raise_error(SomeError, "oops")
      expect { some_method }.to raise_error(SomeError, /oops/)
      expect { some_method }.to raise_error(...){|e| expect(e.data).to eq "oops" }
      
      # Rspec also offers to_not:
      expect { some_method }.to_not raise_error
      ...
      

      注意:raise_errorraise_exception 可以互换。

      RSpec 1

      lambda { some_method }.should raise_error
      lambda { some_method }.should raise_error(SomeError)
      lambda { some_method }.should raise_error(SomeError, "oops")
      lambda { some_method }.should raise_error(SomeError, /oops/)
      lambda { some_method }.should raise_error(...){|e| e.data.should == "oops" }
      
      # Rspec also offers should_not:
      lambda { some_method }.should_not raise_error
      ...
      

      注意:raise_errorraise_exception 的别名。

      文档:https://www.relishapp.com/rspec

      RSpec 2:

      RSpec 1:

      【讨论】:

      • raise_error(/oops/) 是检查异常消息中子字符串的好方法
      • 感谢您指出 raise_error 和 raise_exception 是可以互换的 (y)
      【解决方案3】:
      expect { some_method }.to raise_error
      

      RSpec 1 语法:

      lambda { some_method }.should raise_error
      

      请参阅the documentation(RSpec 1 语法)和RSpec 2 documentation 了解更多信息。

      【讨论】:

      • 啊..我刚刚注意到花括号!
      【解决方案4】:

      用expect代替lambda:

         expect { some_method }.to raise_error
      

      这适用于 rspec 的更新版本,即 rspec 2.0 及更高版本。

      请参阅doco 了解更多信息。

      【讨论】:

      • 我不会将它用于 Rspec 1,但对于 Rspec 2,它可以正常工作。
      • 其实按照上面的文档链接,应该是expect { some_method }.to raise_error
      • 您的评论和链接到的页面都不能解释为什么expectlambda 更好或更差。
      • expect 适用于 rspec 2.0 及更高版本。这使得争论哪个更好,因为 lambda 语法不再起作用
      • 这对我在水豚中不起作用:expect { visit welcome_path }.to raise_error
      【解决方案5】:

      语法最近发生了变化,现在是:

      expect { ... }.to raise_error(ErrorClass)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-31
        • 1970-01-01
        • 2016-05-23
        • 2021-12-19
        • 2012-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多