Bagaimana cara menggunakan RSpec's should_raise dengan segala macam pengecualian?


211

Saya ingin melakukan sesuatu seperti ini:

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

Bagaimana saya harus melakukan ini?

some_method.should_raise exception

... tidak bekerja.

Jawaban:



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
...

Catatan: raise_errordan raise_exceptiondapat dipertukarkan.

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
...

Catatan: raise_erroradalah alias untuk raise_exception.

Dokumentasi: https://www.relishapp.com/rspec

RSpec 2:

RSpec 1:


Itu jawaban yang bagus.
Ziggy

rais_error (/ oops /) adalah cara yang bagus untuk memeriksa substring dalam pesan pengecualian
Serge Seletskyy

1
Terima kasih telah menunjukkan bahwa rais_error dan untuk rais_exception dapat dipertukarkan (y)
Yo Ludke

85

Alih-alih lambda, gunakan harapkan untuk:

   expect { some_method }.to raise_error

Ini berlaku untuk versi rspec yang lebih baru, yaitu rspec 2.0 dan lebih tinggi.

Lihat acara dokumenter untuk lebih.


Saya tidak akan menggunakan ini untuk Rspec 1 tetapi untuk Rspec 2 berfungsi sebagaimana mestinya.
ericraio

6
Sebenarnya, sesuai dengan tautan dokumentasi di atas, ini seharusnya diharapkan {some_method} .to meningkatkan_error
Guilherme Garnier

Baik komentar maupun halaman yang Anda tautkan menjelaskan mengapa expectlebih baik atau lebih buruk daripada lambda.
Kragen Javier Sitaker

1
harapkan untuk rspec 2.0 dan lebih tinggi. Hal ini membuat memperdebatkan argumen tentang mana yang lebih baik, karena sintaks lambda tidak berfungsi lagi
Rob

Ini tidak berfungsi untuk saya di capybara:expect { visit welcome_path }.to raise_error
nnyby

65

Sintaks berubah baru-baru ini dan sekarang adalah:

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

4

Dari versi 3.3 on rspec-expectionsgem memunculkan peringatan untuk rais_error kosong tanpa parameter

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

Ini memberi Anda petunjuk bahwa kode Anda mungkin gagal dengan kesalahan yang berbeda dari tes yang dimaksudkan untuk memeriksa.

PERINGATAN: Menggunakan raise_errorpencocokan tanpa memberikan kesalahan spesifik atau pesan berisiko positif palsu, karena raise_errorakan cocok ketika Ruby menaikkan NoMethodError, NameErroratau ArgumentError, berpotensi membiarkan harapan lewat tanpa bahkan menjalankan metode yang ingin Anda panggil. Alih-alih mempertimbangkan untuk memberikan kelas kesalahan atau pesan tertentu. Pesan ini dapat ditekan dengan pengaturan: RSpec::Expectations.configuration.warn_about_potential_false_positives = false.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.