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:
- https://www.relishapp.com/rspec/rspec-expectations/v/2-13/docs/built-in-matchers/raise-error-matcher
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 queraise_error
coincidirá cuando RubyNoMethodError
unNoMethodError
,NameError
oArgumentError
, 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.