RSpec的最佳实践期望raise_error

时间:2017-06-13 07:54:22

标签: ruby exception rspec

我有一些RSpec代码。 我(或不是我的)类可以(或不)调用特定的异常。 Ex,Class :: Foo :: Bar :: TimeOutError。 我想检查一下。

describe :describe_description do
  before :all do
    object = Class.new
    # method can be call Class::Foo::Bar::TimeOutError
    object.method
  end
  it :exception do
    expect {}.to_not raise_error Class::Foo::Bar::TimeOutError
  end
end

此代码有效,但RSpec写了警告:

  

警告:使用expect { }.not_to raise_error(SpecificErrorClass)会产生误报,因为任何其他错误都会导致期望通过,包括Ruby提出的那些(例如NoMethodError,NameError和ArgumentError),这意味着您打算测试的代码可能甚至没有达到。而是考虑使用expect {}.not_to raise_errorexpect { }.to raise_error(DifferentSpecificErrorClass)。可以通过设置RSpec::Expectations.configuration.on_potential_false_positives = :nothing来禁止此消息。

如何修复代码以使RSpec正常工作并且不会发出警告?

1 个答案:

答案 0 :(得分:1)

不,如果没有此警告,则无法在规范中应用expect {}.to_not raise_error(这就是添加此警告的全部内容)。

从逻辑上讲这是没有意义的,因为您不需要显式检查未引发的错误类型。

场景1 。代码成功执行(即完全没有错误)。然后通过测试本身就意味着没有抛出Class::Foo::Bar::TimeOutError

方案2 。引发另一种错误。然后expect {}.to_not raise_error Class::Foo::Bar::TimeOutError并没有进行任何测试,它仍然只是通过而产生了误报。

方案3 。如果您确实要使用它,请使用设置on_potential_false_positives进行抑制,然后测试将继续进行,而不会出现警告。如果通过,则与使expect {}.to_not raise_error仍然多余的情况没有任何区别。