Skip to content

Commit

Permalink
Merge pull request rails#6525 from freerange/minitest-passthrough-exc…
Browse files Browse the repository at this point in the history
…eptions

Exceptions like Interrupt & NoMemoryError should not be rescued in tests.
  • Loading branch information
josevalim committed May 29, 2012
2 parents 2d898cd + 7d8e5fa commit 6ba93ac
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 8 deletions.
12 changes: 12 additions & 0 deletions activesupport/lib/active_support/testing/setup_and_teardown.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@
module ActiveSupport
module Testing
module SetupAndTeardown

PASSTHROUGH_EXCEPTIONS = [
NoMemoryError,
SignalException,
Interrupt,
SystemExit
]

extend ActiveSupport::Concern

included do
Expand All @@ -28,11 +36,15 @@ def run(runner)
run_callbacks :setup do
result = super
end
rescue *PASSTHROUGH_EXCEPTIONS
raise
rescue Exception => e
result = runner.puke(self.class, method_name, e)
ensure
begin
run_callbacks :teardown
rescue *PASSTHROUGH_EXCEPTIONS
raise
rescue Exception => e
result = runner.puke(self.class, method_name, e)
end
Expand Down
58 changes: 50 additions & 8 deletions activesupport/test/test_case_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,9 @@ def options
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
Expand All @@ -41,11 +39,9 @@ def test_true; assert true end
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
Expand All @@ -63,5 +59,51 @@ def test_true; assert true end
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

0 comments on commit 6ba93ac

Please sign in to comment.