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


211

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

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

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

some_method.should_raise exception

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

Ответы:



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:


Это был отличный ответ.
Зигги

Повышение_еррор (/ oops /) - отличный способ проверить подстроку в сообщении об исключении
Серж Селецкий,

1
Спасибо за то, что указали на то, что lift_error и для lift_exception взаимозаменяемы (у)
Йо Лудке

85

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

   expect { some_method }.to raise_error

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

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


Я бы не использовал это для 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)

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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.