RSpec'in should_raise'ı her türlü istisna dışında nasıl kullanılır?


211

Böyle bir şey yapmak istiyorum:

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

Bunu nasıl yapmalıyım?

some_method.should_raise exception

... çalışmıyor.

Yanıtlar:



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

Not: raise_errorve raise_exceptiondeğiştirilebilir.

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

Not: raise_erroriçin bir takma addır raise_exception.

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

RSpec 2:

RSpec 1:


Harika bir cevaptı.
Ziggy

elev_error (/ oops /), istisna mesajında ​​alt dize kontrol etmek için harika bir yoldur
Serge Seletskyy

1
Elev_error ve elev_exception'ın birbirinin yerine kullanılabileceğine dikkat çektiğin için teşekkürler (y)
Yo Ludke

85

Lambda yerine şunu kullanın:

   expect { some_method }.to raise_error

Bu rspec'in daha yeni sürümleri için geçerlidir, yani rspec 2.0 ve üstü.

Daha fazla bilgi için doco'ya bakın .


Bunu Rspec 1 için kullanmazdım ama Rspec 2 için olması gerektiği gibi çalışır.
ericraio

6
Aslında, yukarıdaki dokümantasyon bağlantısına göre, bunun {some_method} .to yükseltmek
Guilherme Garnier

Ne yorumunuz ne de bağlantı verdiğiniz sayfa neden expectdaha iyi veya daha kötü olduğunu açıklıyor lambda.
Kragen Javier Sitaker

1
beklemek rspec 2.0 ve üstü içindir. Bu, lambda sözdizimi artık çalışmadığından hangisinin daha iyi olduğu argümanını tartışıyor
Rob

Bu capybara benim için işe yaramıyor:expect { visit welcome_path }.to raise_error
nnyby

65

Sözdizimi son zamanlarda değişti ve şimdi:

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

4

rspec-expectionsGem 3.3 sürümünden itibaren parametresiz boş bir kaldır_ hatası için uyarı verir

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

Bu, kodunuzun kontrol edilmesi amaçlanan testten farklı bir hatayla başarısız olabileceğine dair bir ipucu verir.

UYARI: kullanma raise_erroreşleyici Belirli bir hatayı veya mesajı vermeden beri, yanlış pozitif riskleri raise_errorRuby bir yükseltir zaman maç olacak NoMethodError, NameErrorya da ArgumentErrorpotansiyel olarak beklenti bile aramak niyetinde yöntemi yürütme olmadan geçmesine izin. Bunun yerine belirli bir hata sınıfı veya mesaj sağlamayı düşünün. Bu mesaj ayarı ile düşürülmüştür edilebilir: RSpec::Expectations.configuration.warn_about_potential_false_positives = false.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.