为什么RSpec中的负特定异常期望被弃用?

时间:2014-11-14 19:41:36

标签: ruby rspec deprecated

似乎我可以为.to指定异常类但不允许为.not_to指定异常类? 这究竟是什么原因?

 Failure/Error: expect{ smth }.not_to raise_exception SomeExceptionClass
 ArgumentError:
   `expect { }.not_to raise_error(SpecificErrorClass)` is not valid, use `expect { }.not_to raise_error` (with no args) instead

3 个答案:

答案 0 :(得分:2)

扩大Nakilon的答案:

这是他们的设计决定。看起来他们认为这不是一个很好的测试指定,因为如果你期望某个错误被引发,那么测试将在以下情况下通过:

  • 没有出现错误
  • 引发了其他一些错误

......这至少是不精确的。可能你的代码只想做其中的一件事。

这似乎是推理,无论如何 - 我不想说它有多公平。

答案 1 :(得分:0)

来自changelog

  

expect { }.to_not raise_error(SomeSpecificClass, message)expect { }.to_not raise_error(SomeSpecificClass)expect { }.to_not raise_error(message)无效,因为它们很容易隐藏失败。   相反,使用expect { }.to_not raise_error(没有args)。 (山姆   菲彭)

答案 2 :(得分:0)

似乎他们意识到没有理由弃用异常类参数,因此它目前有效:https://www.relishapp.com/rspec/rspec-expectations/v/3-5/docs/built-in-matchers/raise-error-matcher

例如,在Selenium中,在检查某些条件成为真之后:

Selenium::WebDriver::Wait.new(
  message: message,
  timeout: timeout,
).until do
  f() == x
end

现在很容易等待它在下一秒内不会因为否定超时异常而变为假:

  begin
    Selenium::WebDriver::Wait.new(
      timeout: timeout,
    ).until do
      f() != x
    end
    raise message
  rescue Selenium::WebDriver::Error::TimeOutError
  end