aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport
diff options
context:
space:
mode:
Diffstat (limited to 'activesupport')
-rw-r--r--activesupport/CHANGELOG4
-rw-r--r--activesupport/lib/active_support.rb3
-rw-r--r--activesupport/lib/active_support/test_case.rb12
-rw-r--r--activesupport/lib/active_support/testing.rb1
-rw-r--r--activesupport/lib/active_support/testing/default.rb9
-rw-r--r--activesupport/lib/active_support/testing/setup_and_teardown.rb127
-rw-r--r--activesupport/test/core_ext/load_error_test.rb (renamed from activesupport/test/core_ext/load_error_tests.rb)2
-rw-r--r--activesupport/test/test_test.rb46
8 files changed, 191 insertions, 13 deletions
diff --git a/activesupport/CHANGELOG b/activesupport/CHANGELOG
index 16296a579f..a4a605c782 100644
--- a/activesupport/CHANGELOG
+++ b/activesupport/CHANGELOG
@@ -1,5 +1,9 @@
*SVN*
+* Continue evolution toward ActiveSupport::TestCase. #10679 [Josh Peek]
+
+* TestCase: introduce declared setup and teardown callbacks. Pass a list of methods and an optional block to call before setup or after teardown. Setup callbacks are run in the order declared; teardown callbacks are run in reverse. [Jeremy Kemper]
+
* Added ActiveSupport::Gzip.decompress/compress(source) as an easy wrapper for Zlib [Tobias Luetke]
* Included MemCache-Client to make the improved ActiveSupport::Cache::MemCacheStore work out of the box [Bob Cottrell, Eric Hodel]
diff --git a/activesupport/lib/active_support.rb b/activesupport/lib/active_support.rb
index c459511dc8..c4b7cc8cba 100644
--- a/activesupport/lib/active_support.rb
+++ b/activesupport/lib/active_support.rb
@@ -49,6 +49,3 @@ require 'active_support/json'
require 'active_support/multibyte'
require 'active_support/base64'
-
-require 'active_support/testing'
-
diff --git a/activesupport/lib/active_support/test_case.rb b/activesupport/lib/active_support/test_case.rb
index be8f8b17fc..67cde1556c 100644
--- a/activesupport/lib/active_support/test_case.rb
+++ b/activesupport/lib/active_support/test_case.rb
@@ -1,5 +1,13 @@
+require 'test/unit/testcase'
+require 'active_support/testing/setup_and_teardown'
+require 'active_support/testing/default'
+
+# TODO: move to core_ext
+class Test::Unit::TestCase #:nodoc:
+ include ActiveSupport::Testing::SetupAndTeardown
+end
+
module ActiveSupport
class TestCase < Test::Unit::TestCase
- include ActiveSupport::Testing::Default
end
-end \ No newline at end of file
+end
diff --git a/activesupport/lib/active_support/testing.rb b/activesupport/lib/active_support/testing.rb
deleted file mode 100644
index 1bf30cbbdd..0000000000
--- a/activesupport/lib/active_support/testing.rb
+++ /dev/null
@@ -1 +0,0 @@
-require 'active_support/testing/default' \ No newline at end of file
diff --git a/activesupport/lib/active_support/testing/default.rb b/activesupport/lib/active_support/testing/default.rb
index d97a610c79..a0bd6303c7 100644
--- a/activesupport/lib/active_support/testing/default.rb
+++ b/activesupport/lib/active_support/testing/default.rb
@@ -1,12 +1,9 @@
module ActiveSupport
module Testing
- module Default
- def run(*args)
- #method_name appears to be a symbol on 1.8.4 and a string on 1.8.6
- return if @method_name.to_s == "default_test"
- super
+ module Default #:nodoc:
+ # Placeholder so test/unit ignores test cases without any tests.
+ def default_test
end
end
end
end
-
diff --git a/activesupport/lib/active_support/testing/setup_and_teardown.rb b/activesupport/lib/active_support/testing/setup_and_teardown.rb
new file mode 100644
index 0000000000..1639462fae
--- /dev/null
+++ b/activesupport/lib/active_support/testing/setup_and_teardown.rb
@@ -0,0 +1,127 @@
+module ActiveSupport
+ module Testing
+ module SetupAndTeardown
+ def self.included(base)
+ base.extend ClassMethods
+
+ begin
+ require 'mocha'
+ base.alias_method_chain :run, :callbacks_and_mocha
+ rescue LoadError
+ base.alias_method_chain :run, :callbacks
+ end
+ end
+
+ module ClassMethods
+ def setup(*method_names, &block)
+ method_names << block if block_given?
+ (@setup_callbacks ||= []).concat method_names
+ end
+
+ def teardown(*method_names, &block)
+ method_names << block if block_given?
+ (@teardown_callbacks ||= []).concat method_names
+ end
+
+ def setup_callback_chain
+ @setup_callbacks ||= []
+
+ if superclass.respond_to?(:setup_callback_chain)
+ superclass.setup_callback_chain + @setup_callbacks
+ else
+ @setup_callbacks
+ end
+ end
+
+ def teardown_callback_chain
+ @teardown_callbacks ||= []
+
+ if superclass.respond_to?(:teardown_callback_chain)
+ superclass.teardown_callback_chain + @teardown_callbacks
+ else
+ @teardown_callbacks
+ end
+ end
+ end
+
+ # This redefinition is unfortunate but test/unit shows us no alternative.
+ def run_with_callbacks(result) #:nodoc:
+ return if @method_name.to_s == "default_test"
+
+ yield(Test::Unit::TestCase::STARTED, name)
+ @_result = result
+ begin
+ run_callbacks :setup
+ setup
+ __send__(@method_name)
+ rescue Test::Unit::AssertionFailedError => e
+ add_failure(e.message, e.backtrace)
+ rescue *Test::Unit::TestCase::PASSTHROUGH_EXCEPTIONS
+ raise
+ rescue Exception
+ add_error($!)
+ ensure
+ begin
+ teardown
+ run_callbacks :teardown, :reverse_each
+ rescue Test::Unit::AssertionFailedError => e
+ add_failure(e.message, e.backtrace)
+ rescue *Test::Unit::TestCase::PASSTHROUGH_EXCEPTIONS
+ raise
+ rescue Exception
+ add_error($!)
+ end
+ end
+ result.add_run
+ yield(Test::Unit::TestCase::FINISHED, name)
+ end
+
+ # Doubly unfortunate: mocha does the same so we have to hax their hax.
+ def run_with_callbacks_and_mocha(result)
+ return if @method_name.to_s == "default_test"
+
+ yield(Test::Unit::TestCase::STARTED, name)
+ @_result = result
+ begin
+ mocha_setup
+ begin
+ run_callbacks :setup
+ setup
+ __send__(@method_name)
+ mocha_verify { add_assertion }
+ rescue Mocha::ExpectationError => e
+ add_failure(e.message, e.backtrace)
+ rescue Test::Unit::AssertionFailedError => e
+ add_failure(e.message, e.backtrace)
+ rescue StandardError, ScriptError
+ add_error($!)
+ ensure
+ begin
+ teardown
+ run_callbacks :teardown, :reverse_each
+ rescue Test::Unit::AssertionFailedError => e
+ add_failure(e.message, e.backtrace)
+ rescue StandardError, ScriptError
+ add_error($!)
+ end
+ end
+ ensure
+ mocha_teardown
+ end
+ result.add_run
+ yield(Test::Unit::TestCase::FINISHED, name)
+ end
+
+ protected
+ def run_callbacks(kind, enumerator = :each)
+ self.class.send("#{kind}_callback_chain").send(enumerator) do |callback|
+ case callback
+ when Proc; callback.call(self)
+ when String, Symbol; send!(callback)
+ else raise ArgumentError, "Unrecognized callback #{callback.inspect}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/activesupport/test/core_ext/load_error_tests.rb b/activesupport/test/core_ext/load_error_test.rb
index 34c5cb4cda..5bb5b4d1b8 100644
--- a/activesupport/test/core_ext/load_error_tests.rb
+++ b/activesupport/test/core_ext/load_error_test.rb
@@ -1,4 +1,4 @@
-require File.dirname(__FILE__) + '/../abstract_unit'
+require 'abstract_unit'
class TestMissingSourceFile < Test::Unit::TestCase
def test_with_require
diff --git a/activesupport/test/test_test.rb b/activesupport/test/test_test.rb
index 9ac54db69b..88b505e59c 100644
--- a/activesupport/test/test_test.rb
+++ b/activesupport/test/test_test.rb
@@ -72,3 +72,49 @@ end
class AlsoDoingNothingTest < ActiveSupport::TestCase
end
+
+# Setup and teardown callbacks.
+class SetupAndTeardownTest < Test::Unit::TestCase
+ setup :reset_callback_record, :foo
+ teardown :foo, :sentinel, :foo
+
+ def test_inherited_setup_callbacks
+ assert_equal [:reset_callback_record, :foo], self.class.setup_callback_chain
+ assert_equal [:foo], @called_back
+ assert_equal [:foo, :sentinel, :foo], self.class.teardown_callback_chain
+ end
+
+ protected
+ def reset_callback_record
+ @called_back = []
+ end
+
+ def foo
+ @called_back << :foo
+ end
+
+ def sentinel
+ assert_equal [:foo, :foo], @called_back
+ end
+end
+
+
+class SubclassSetupAndTeardownTest < SetupAndTeardownTest
+ setup :bar
+ teardown :bar
+
+ def test_inherited_setup_callbacks
+ assert_equal [:reset_callback_record, :foo, :bar], self.class.setup_callback_chain
+ assert_equal [:foo, :bar], @called_back
+ assert_equal [:foo, :sentinel, :foo, :bar], self.class.teardown_callback_chain
+ end
+
+ protected
+ def bar
+ @called_back << :bar
+ end
+
+ def sentinel
+ assert_equal [:foo, :bar, :bar, :foo], @called_back
+ end
+end