Skip to content

Commit

Permalink
Merge pull request #6532 from freerange/3-1-stable-minitest-passthrou…
Browse files Browse the repository at this point in the history
…gh-exceptions

Exceptions like Interrupt should not be rescued in tests.
  • Loading branch information
rafaelfranca committed May 29, 2012
2 parents a74b6a0 + 4cd3285 commit 2f42815
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,22 @@ def teardown(*args, &block)
end

module ForMiniTest
PASSTHROUGH_EXCEPTIONS = MiniTest::Unit::TestCase::PASSTHROUGH_EXCEPTIONS rescue [NoMemoryError, SignalException, Interrupt, SystemExit]
def run(runner)
result = '.'
begin
run_callbacks :setup do
result = super
end
rescue *PASSTHROUGH_EXCEPTIONS => e
raise e
rescue Exception => e
result = runner.puke(self.class, method_name, e)
ensure
begin
run_callbacks :teardown
rescue *PASSTHROUGH_EXCEPTIONS => e
raise e
rescue Exception => e
result = runner.puke(self.class, method_name, e)
end
Expand Down
44 changes: 42 additions & 2 deletions activesupport/test/test_case_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def options
end

if defined?(MiniTest::Assertions) && TestCase < MiniTest::Assertions
def test_callback_with_exception
def test_standard_error_raised_within_setup_callback_is_puked
tc = Class.new(TestCase) do
setup :bad_callback
def bad_callback; raise 'oh noes' end
Expand All @@ -38,7 +38,7 @@ 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
teardown :bad_callback
def bad_callback; raise 'oh noes' end
Expand All @@ -56,6 +56,46 @@ 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 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
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
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
end

0 comments on commit 2f42815

Please sign in to comment.