Как использовать RSpec's should_raise с любыми исключениями? - PullRequest
211 голосов
/ 12 ноября 2009

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

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

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

some_method.should_raise exception

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

Ответы [ 5 ]

380 голосов
/ 12 ноября 2009
expect { some_method }.to raise_error

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

lambda { some_method }.should raise_error

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

86 голосов
/ 15 мая 2012

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:

84 голосов
/ 09 августа 2011

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

   expect { some_method }.to raise_error

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

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

65 голосов
/ 28 апреля 2012

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

expect { ... }.to raise_error(ErrorClass)
4 голосов
/ 05 августа 2015

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

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...