1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Exceptions like Interrupt should not be rescued.

Neither Test::Unit nor MiniTest rescue exceptions like Interrupt or
NoMemoryError, but ActiveSupport::Testing::SetupAndTeardown#run which
overrides MiniTest::Unit::TestCase#run rescues them.

Rescuing an Interrupt exception is annoying, because it means when you
are running a lot of tests e.g. when running one of the rake test tasks,
you cannot break out using ctrl-C.

Rescuing exceptions like NoMemoryError is foolish, because the most
sensible thing to happen is for the process to terminate as soon as
possible.

This solution probably needs some finessing e.g. I'm not clear whether
the assumption is that only MiniTest is supported. Also early versions
of MiniTest did not have this behaviour. However, hopefully it's a
start.

Integrating with Test::Unit & MiniTest has always been a pain. It would
be great if both of them provided sensible extension points for the kind
of things that both Rails and Mocha want to do.
This commit is contained in:
James Mead 2012-05-28 22:44:28 +01:00
parent f5e26bcb1a
commit b057fab638
2 changed files with 54 additions and 8 deletions

View file

@ -28,11 +28,15 @@ module ActiveSupport
run_callbacks :setup do
result = super
end
rescue *::MiniTest::Unit::TestCase::PASSTHROUGH_EXCEPTIONS
raise
rescue Exception => e
result = runner.puke(self.class, method_name, e)
ensure
begin
run_callbacks :teardown
rescue *::MiniTest::Unit::TestCase::PASSTHROUGH_EXCEPTIONS
raise
rescue Exception => e
result = runner.puke(self.class, method_name, e)
end

View file

@ -18,11 +18,9 @@ module ActiveSupport
end
end
def test_callback_with_exception
def test_standard_error_raised_within_setup_callback_is_puked
tc = Class.new(TestCase) do
def self.name
nil
end
def self.name; nil; end
setup :bad_callback
def bad_callback; raise 'oh noes' end
@ -41,11 +39,9 @@ module ActiveSupport
assert_equal 'oh noes', exception.message
end
def test_teardown_callback_with_exception
def test_standard_error_raised_within_teardown_callback_is_puked
tc = Class.new(TestCase) do
def self.name
nil
end
def self.name; nil; end
teardown :bad_callback
def bad_callback; raise 'oh noes' end
@ -63,5 +59,51 @@ module ActiveSupport
assert_equal test_name, name
assert_equal 'oh noes', exception.message
end
def test_passthrough_exception_raised_within_test_method_is_not_rescued
tc = Class.new(TestCase) do
def self.name; nil; end
def test_which_raises_interrupt; raise Interrupt; end
end
test_name = 'test_which_raises_interrupt'
fr = FakeRunner.new
test = tc.new test_name
assert_raises(Interrupt) { test.run fr }
end
def test_passthrough_exception_raised_within_setup_callback_is_not_rescued
tc = Class.new(TestCase) do
def self.name; nil; end
setup :callback_which_raises_interrupt
def callback_which_raises_interrupt; raise Interrupt; end
def test_true; assert true end
end
test_name = 'test_true'
fr = FakeRunner.new
test = tc.new test_name
assert_raises(Interrupt) { test.run fr }
end
def test_passthrough_exception_raised_within_teardown_callback_is_not_rescued
tc = Class.new(TestCase) do
def self.name; nil; end
teardown :callback_which_raises_interrupt
def callback_which_raises_interrupt; raise Interrupt; end
def test_true; assert true end
end
test_name = 'test_true'
fr = FakeRunner.new
test = tc.new test_name
assert_raises(Interrupt) { test.run fr }
end
end
end