Я хотел бы сделать что-то вроде этого:
some_method.should_raise <any kind of exception, I don't care>
Как мне это сделать?
some_method.should_raise exception
... не работает.
Я хотел бы сделать что-то вроде этого:
some_method.should_raise <any kind of exception, I don't care>
Как мне это сделать?
some_method.should_raise exception
... не работает.
expect { some_method }.to raise_error
RSpec 1 Синтаксис:
lambda { some_method }.should raise_error
Смотрите документацию (для синтаксиса RSpec 1) и Документация RSpec 2 для более.
Вместо лямбда используйте ожидание:
expect { some_method }.to raise_error
Это относится к более поздним версиям rspec, то есть rspec 2.0 и выше.
Подробнее см. doco.
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
являются взаимозаменяемыми.
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
.
RSpec 2:
RSpec 1:
Синтаксис изменился недавно, и теперь это:
expect { ... }.to raise_error(ErrorClass)
В версии 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
.