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.
Expand Up @@ -28,17 +28,22 @@ def teardown(*args, &block)
end end


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


if defined?(MiniTest::Assertions) && TestCase < MiniTest::Assertions 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 tc = Class.new(TestCase) do
setup :bad_callback setup :bad_callback
def bad_callback; raise 'oh noes' end 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 assert_equal 'oh noes', exception.message
end end


def test_teardown_callback_with_exception def test_standard_error_raised_within_teardown_callback_is_puked
tc = Class.new(TestCase) do tc = Class.new(TestCase) do
teardown :bad_callback teardown :bad_callback
def bad_callback; raise 'oh noes' end 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 test_name, name
assert_equal 'oh noes', exception.message assert_equal 'oh noes', exception.message
end 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 end
end end

0 comments on commit 2f42815

Please sign in to comment.