Як користуватися must_raise RSpec з будь-яким винятком?


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:


Це була чудова відповідь.
Ziggy

підвищення_error (/ oops /) - це прекрасний спосіб перевірити підрядку у повідомленні про виключення
Сергій Селецький

1
Дякуємо за те, що вказали, що підвищення_error та нарахування_exception є взаємозамінними (y)
Yo Ludke

85

Замість лямбда використовуйте очікуйте:

   expect { some_method }.to raise_error

Це стосується новіших версій rspec, тобто rspec 2.0 і вище.

Докладніше див. У doco .


Я б не використовував це для Rspec 1, але для Rspec 2 він працює як слід.
ericraio

6
Насправді, згідно з посиланням на документацію вище, цього слід очікувати {some_method} .to підвищити_error
Гарньє

Ні ваш коментар, ні сторінка, на яку ви посилаєтесь, не пояснюють, чому expectце краще чи гірше lambda.
Краген Хав'єр Сітакер

1
Очікуємо, що для rspec 2.0 і вище. Це викликає суперечки щодо того, який з них кращий, оскільки синтаксис лямбда більше не працює
Роб

Це не працює для мене в capybara:expect { visit welcome_path }.to raise_error
nnyby


4

З версії 3.3 на rspec-expectionsgem виникає попередження про порожній піднімаючий_помилка без параметра

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

Це дає вам підказку, що ваш код може вийти з помилки, відмінної від тесту, який планується перевірити.

ПОПЕРЕДЖЕННЯ: Використання raise_errorматчера без надання конкретної помилки чи повідомлення загрожує помилковим спрацьовуванням, оскільки воно raise_errorзбігатиметься, коли Ruby піднімає a NoMethodError, NameErrorабо ArgumentError, можливо, дозволяє очікуванню пройти, навіть не виконуючи метод, який ви збираєтесь викликати. Натомість розгляньте можливість надання конкретного класу помилок або повідомлення. Це повідомлення може бути придушене з допомогою параметра: RSpec::Expectations.configuration.warn_about_potential_false_positives = false.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.