it-roy-ru.com

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

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

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

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

some_method.should_raise exception

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

211
marcgg
expect { some_method }.to raise_error

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

lambda { some_method }.should raise_error

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

379
Avdi

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:

86
joelparkerhenderson

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

   expect { some_method }.to raise_error

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

Смотрите DOCO для получения дополнительной информации.

84
racc

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

expect { ... }.to raise_error(ErrorClass)
65
ayckoster

Начиная с версии 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.

4
Bruno E.