From 70fae9a434d64238663fea3d4c6abdc86206a0f2 Mon Sep 17 00:00:00 2001 From: Edouard CHIN Date: Thu, 5 Apr 2018 22:22:46 -0400 Subject: `SetupAndTeardown#teardown` should call any subsequent after_teardown: If you have a regular test that have a teardown block, and for any reason an exception get raised, ActiveSupport will not run subsequent after_teardown method provided by other module or gems. One of them being the ActiveRecord::TestFixtures which won't rollback the transation when the test ends making all subsequent test to be in a weird state. The default implementation of minitest is to run all teardown methods from the user's test, rescue all exceptions, run all after_teardown methods provided by libraries and finally re-raise the exception that happened in the user's teardown method. Rails should do the same. --- .../test/testing/setup_and_teardown_test.rb | 34 ++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 activesupport/test/testing/setup_and_teardown_test.rb (limited to 'activesupport/test/testing') diff --git a/activesupport/test/testing/setup_and_teardown_test.rb b/activesupport/test/testing/setup_and_teardown_test.rb new file mode 100644 index 0000000000..283f82d19a --- /dev/null +++ b/activesupport/test/testing/setup_and_teardown_test.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +require "abstract_unit" + +module OtherAfterTeardown + def after_teardown + @witness = true + end +end + +class SetupAndTeardownTest < Minitest::Test + include OtherAfterTeardown + include ActiveSupport::Testing::SetupAndTeardown + + attr_writer :witness + + MyError = Class.new(StandardError) + + teardown do + raise MyError, "Test raises an error, all after_teardown should still get called" + end + + def after_teardown + assert_raises MyError do + super + end + + assert_equal true, @witness + end + + def test_teardown_raise_but_all_after_teardown_method_are_called + assert true + end +end -- cgit v1.2.3