mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
b057fab638
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.
109 lines
2.6 KiB
Ruby
109 lines
2.6 KiB
Ruby
require 'abstract_unit'
|
|
|
|
module ActiveSupport
|
|
class TestCaseTest < ActiveSupport::TestCase
|
|
class FakeRunner
|
|
attr_reader :puked
|
|
|
|
def initialize
|
|
@puked = []
|
|
end
|
|
|
|
def puke(klass, name, e)
|
|
@puked << [klass, name, e]
|
|
end
|
|
|
|
def options
|
|
nil
|
|
end
|
|
end
|
|
|
|
def test_standard_error_raised_within_setup_callback_is_puked
|
|
tc = Class.new(TestCase) do
|
|
def self.name; nil; end
|
|
|
|
setup :bad_callback
|
|
def bad_callback; raise 'oh noes' end
|
|
def test_true; assert true end
|
|
end
|
|
|
|
test_name = 'test_true'
|
|
fr = FakeRunner.new
|
|
|
|
test = tc.new test_name
|
|
test.run fr
|
|
klass, name, exception = *fr.puked.first
|
|
|
|
assert_equal tc, klass
|
|
assert_equal test_name, name
|
|
assert_equal 'oh noes', exception.message
|
|
end
|
|
|
|
def test_standard_error_raised_within_teardown_callback_is_puked
|
|
tc = Class.new(TestCase) do
|
|
def self.name; nil; end
|
|
|
|
teardown :bad_callback
|
|
def bad_callback; raise 'oh noes' end
|
|
def test_true; assert true end
|
|
end
|
|
|
|
test_name = 'test_true'
|
|
fr = FakeRunner.new
|
|
|
|
test = tc.new test_name
|
|
test.run fr
|
|
klass, name, exception = *fr.puked.first
|
|
|
|
assert_equal tc, klass
|
|
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
|