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

211

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

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

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

some_method.should_raise exception

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

marcgg
источник

Ответы:

380
expect { some_method }.to raise_error

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

lambda { some_method }.should raise_error

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

AVDI
источник
5
ааа .. я только что заметил фигурные скобки!
Луи Сэйерс
88

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:

joelparkerhenderson
источник
Это был отличный ответ.
Зигги
Повышение_еррор (/ oops /) - отличный способ проверить подстроку в сообщении об исключении
Серж Селецкий,
1
Спасибо за то, что указали на то, что lift_error и для lift_exception взаимозаменяемы (у)
Йо Лудке
85

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

   expect { some_method }.to raise_error

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

Смотрите документацию для более.

RACC
источник
Я бы не использовал это для Rspec 1, но для Rspec 2 это работает так же, как и должно.
ericraio
6
На самом деле, согласно приведенной выше ссылке на документацию, этого следует ожидать {some_method} .to повысить_error
Гильерме Гарнье
Ни ваш комментарий, ни страница, на которую вы ссылаетесь, не объясняют, почему expectона лучше или хуже lambda.
Краген Хавьер Ситакер
1
ожидаемо для rspec 2.0 и выше. Это делает спор о том, какой из них лучше, так как лямбда-синтаксис больше не работает
Роб
Это не работает для меня в expect { visit welcome_path }.to raise_error
капибаре
65

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

expect { ... }.to raise_error(ErrorClass)
ayckoster
источник
4

Начиная с версии 3.3, в rspec-expectionsгеме выдается предупреждение о пустом рейзе без параметра

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

Это дает вам подсказку о том, что ваш код может завершиться с ошибкой, отличной от теста, предназначенного для проверки.

ПРЕДУПРЕЖДЕНИЕ: Использование raise_errorИскателя без предоставления ошибки конкретной или сообщения рисков ложных срабатываний, так как raise_errorбудет соответствовать , когда Руби поднимает NoMethodError, NameErrorили ArgumentError, потенциально позволяя ожидание пройти даже без выполнения метода вы намерены позвонить. Вместо этого рассмотрите возможность предоставления определенного класса ошибки или сообщения. Это сообщение может быть подавлено с помощью параметра: RSpec::Expectations.configuration.warn_about_potential_false_positives = false.

Бруно Э.
источник