ruby-on-rails ruby exception-handling rspec

ruby on rails - ¿Cómo usar RSpec''s should_raise con cualquier tipo de excepción?



ruby-on-rails exception-handling (5)

Me gustaría hacer algo como esto:

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

¿Cómo debería hacer esto?

some_method.should_raise exception

... no funciona.


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

Nota: raise_error y raise_exception son intercambiables.

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

Nota: raise_error es un alias para raise_exception .

Documentación: https://www.relishapp.com/rspec

RSpec 2:

RSpec 1:


A partir de la versión 3.3 en rspec-expections gema genera una advertencia para un raise_error en blanco sin un parámetro

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

Esto le da una pista de que su código puede fallar con un error diferente del que la prueba pretende verificar.

ADVERTENCIA: El uso del raise_error sin proporcionar un error o mensaje específico conlleva falsos positivos, ya que raise_error coincidirá cuando Ruby NoMethodError un NoMethodError , NameError o ArgumentError , permitiendo potencialmente que la expectativa pase sin siquiera ejecutar el método al que pretende llamar. En su lugar, considere proporcionar una clase o mensaje de error específico. Este mensaje se puede suprimir configurando: RSpec::Expectations.configuration.warn_about_potential_false_positives = false .


En lugar de lambda, el uso espera:

expect { some_method }.to raise_error

Esto se aplica a las versiones más recientes de rspec, es decir, rspec 2.0 y superiores.

Ver el doco para más.


La sintaxis ha cambiado recientemente y ahora es:

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


expect { some_method }.to raise_error

RSpec 1 Sintaxis:

lambda { some_method }.should raise_error

Consulte la documentación (para la sintaxis de RSpec 1) y la documentación de RSpec 2 para más información.