代码之家  ›  专栏  ›  技术社区  ›  marcgg

如何使用rspec的应该提出任何例外?

  •  211
  • marcgg  · 技术社区  · 15 年前

    我想这样做:

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

    我该怎么做?

    some_method.should_raise exception
    

    …不起作用。

    5 回复  |  直到 8 年前
        1
  •  378
  •   Community CDub    12 年前
    expect { some_method }.to raise_error
    

    RSPEC 1语法:

    lambda { some_method }.should raise_error
    

    the documentation (用于rspec 1语法)和 RSpec 2 documentation 更多。

        2
  •  86
  •   joelparkerhenderson    12 年前

    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_error raise_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异常 .

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

    RSPEC 2:

    RSPEC 1:

        3
  •  84
  •   gerry3    12 年前

    使用expect来代替lambda:

       expect { some_method }.to raise_error
    

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

    doco 更多。

        4
  •  65
  •   ayckoster    13 年前

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

    expect { ... }.to raise_error(ErrorClass)
    
        5
  •  4
  •   Bruno E.    9 年前

    从3.3版开始 rspec-expections GEM对没有参数的空白RAISE_错误发出警告

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

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

    警告:使用 raise_error 不提供特定错误或消息的matcher会冒误报风险,因为 赖斯误差 当Ruby提出 NoMethodError , NameError ArgumentError ,可能允许在不执行要调用的方法的情况下传递期望。而是考虑提供一个特定的错误类或消息。此消息可以通过设置来抑制: RSpec::Expectations.configuration.warn_about_potential_false_positives = false .