diff options
author | Jeremy Kemper <jeremy@bitsweat.net> | 2008-01-05 13:34:15 +0000 |
---|---|---|
committer | Jeremy Kemper <jeremy@bitsweat.net> | 2008-01-05 13:34:15 +0000 |
commit | 139b92495fa7697cdd619c549d4c7b263562b761 (patch) | |
tree | 20589f9f23d3b19697fed12bb1bf5ce48ef595af /activesupport | |
parent | fe66397adfb5a8057db78afcabd4d7eb0f13a783 (diff) | |
download | rails-139b92495fa7697cdd619c549d4c7b263562b761.tar.gz rails-139b92495fa7697cdd619c549d4c7b263562b761.tar.bz2 rails-139b92495fa7697cdd619c549d4c7b263562b761.zip |
* Continue evolution toward ActiveSupport::TestCase and friends. #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]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8570 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activesupport')
-rw-r--r-- | activesupport/CHANGELOG | 4 | ||||
-rw-r--r-- | activesupport/lib/active_support.rb | 3 | ||||
-rw-r--r-- | activesupport/lib/active_support/test_case.rb | 12 | ||||
-rw-r--r-- | activesupport/lib/active_support/testing.rb | 1 | ||||
-rw-r--r-- | activesupport/lib/active_support/testing/default.rb | 9 | ||||
-rw-r--r-- | activesupport/lib/active_support/testing/setup_and_teardown.rb | 127 | ||||
-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.rb | 46 |
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 |