Как использовать RSpec's should_raise с любыми исключениями?

207

Я хотел бы сделать что-то вроде этого:

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

Как мне это сделать?

some_method.should_raise exception

... не работает.

Теги:
rspec
exception-handling

5 ответов

373
Лучший ответ
expect { some_method }.to raise_error

RSpec 1 Синтаксис:

lambda { some_method }.should raise_error

Смотрите документацию (для синтаксиса RSpec 1) и Документация RSpec 2 для более.

  • 4
    должен поднять Raise_Exception теперь тоже
  • 5
    ааа .. я только что заметил фигурные скобки!
84

Вместо лямбда используйте ожидание:

   expect { some_method }.to raise_error

Это относится к более поздним версиям rspec, то есть rspec 2.0 и выше.

Подробнее см. doco.

  • 0
    Я бы не использовал это для Rspec 1, но для Rspec 2 это работает так же, как и должно.
  • 6
    На самом деле, согласно приведенной выше ссылке на документацию, этого следует ожидать {some_method} .to повысить_error
Показать ещё 4 комментария
79

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_error является псевдонимом для raise_exception.

Документация: https://www.relishapp.com/rspec

RSpec 2:

RSpec 1:

  • 0
    @ Спасибо, добавлено в_не
  • 0
    Это был отличный ответ.
Показать ещё 2 комментария
62

Синтаксис изменился недавно, и теперь это:

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

В версии 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 без предоставления конкретной ошибки или сообщения может привести к ложным срабатываниям, поскольку raise_error будет соответствовать, когда Ruby поднимает значения NoMethodError, NameError или ArgumentError, потенциально позволяя ожиданиям пройти даже не выполняя метод, который вы намереваетесь вызывать. Вместо этого рассмотрите вопрос о предоставлении определенного класса ошибки или сообщения. Это сообщение можно подавить, установив: RSpec::Expectations.configuration.warn_about_potential_false_positives = false.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню