ruby tdd minitest assertion

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