ruby - ¿Cuál es la sintaxis esperada para verificar los mensajes de excepción en assert_raises/must_raise de MiniTest?
tdd assertion (4)
Minitest no le proporciona (todavía) una forma de verificar el mensaje de excepción real. Pero podría agregar un método auxiliar que lo haga y extender la clase ActiveSupport::TestCase
para usar en todas partes en su conjunto de pruebas de rieles, por ejemplo: en test_helper.rb
class ActiveSupport::TestCase
def assert_raises_with_message(exception, msg, &block)
block.call
rescue exception => e
assert_match msg, e.message
else
raise "Expected to raise #{exception} w/ message #{msg}, none raised"
end
end
y úsala en tus pruebas como:
assert_raises_with_message RuntimeError, ''Foo'' do
code_that_raises_RuntimeError_with_Foo_message
end
¿Cuál es la sintaxis esperada para verificar los mensajes de excepción en assert_raises
/ must_raise
?
Intento hacer una aseveración similar a la siguiente, donde "Foo"
es el mensaje de error esperado:
proc { bar.do_it }.must_raise RuntimeError.new("Foo")
Para afirmar la excepción:
assert_raises FooError do
bar.do_it
end
Para afirmar mensaje de excepción:
Según el documento API , assert_raises
devuelve la excepción correspondiente para que pueda verificar el mensaje, los atributos, etc.
exception = assert_raises FooError do
bar.do_it
end
assert_equal(''Foo'', exception.message)
Para agregar algunos desarrollos más recientes, ha habido algunas discusiones sobre assert_raises_with_message
agregar assert_raises_with_message
a minitest en el pasado sin mucha suerte.
Actualmente, hay una solicitud de extracción prometedora esperando a fusionarse. Si y cuando se fusiona, podremos usar assert_raises_with_message
sin tener que definirlo nosotros mismos.
Mientras tanto, hay esta pequeña gema útil llamada minitest-bonus-assertions que define exactamente ese método, junto con algunos otros, para que pueda usarlo de la caja. Vea los docs para más información.
Puede usar la afirmación assert_raises
o la expectativa must_raise
.
it "must raise" do
assert_raises RuntimeError do
bar.do_it
end
-> { bar.do_it }.must_raise RuntimeError
lambda { bar.do_it }.must_raise RuntimeError
proc { bar.do_it }.must_raise RuntimeError
end
Si necesita probar algo en el objeto de error, puede obtenerlo de la afirmación o expectativa así:
describe "testing the error object" do
it "as an assertion" do
err = assert_raises RuntimeError { bar.do_it }
assert_match /Foo/, err.message
end
it "as an exception" do
err = ->{ bar.do_it }.must_raise RuntimeError
err.message.must_match /Foo/
end
end