diff options
author | Michael Koziarski <michael@koziarski.com> | 2007-10-26 02:21:21 +0000 |
---|---|---|
committer | Michael Koziarski <michael@koziarski.com> | 2007-10-26 02:21:21 +0000 |
commit | 2cc0cac3efce92bf9d0e8636f2889c37ca9f57ab (patch) | |
tree | 3ad613f6c73cd9fef243f7586dfcf3b6f329105b /actionpack | |
parent | 2bfd6772a4f3f9e0ff395cfd415dafbc1c9dec80 (diff) | |
download | rails-2cc0cac3efce92bf9d0e8636f2889c37ca9f57ab.tar.gz rails-2cc0cac3efce92bf9d0e8636f2889c37ca9f57ab.tar.bz2 rails-2cc0cac3efce92bf9d0e8636f2889c37ca9f57ab.zip |
Introduce TestCase subclasses for testing rails applications allowing tests to be DRY'd up a bit and to provide a path toward tidying up our monkeypatching of test/unit.
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8022 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'actionpack')
-rw-r--r-- | actionpack/CHANGELOG | 2 | ||||
-rw-r--r-- | actionpack/lib/action_controller/test_case.rb | 53 | ||||
-rw-r--r-- | actionpack/test/controller/test_test.rb | 32 |
3 files changed, 87 insertions, 0 deletions
diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index 33f2d3d8da..19224a9b49 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Introduce a new test case class for functional tests. ActionController::TestCase. [Koz] + * Fix incorrect path in helper rdoc. Closes #9926 [viktor tron] * Partials also set 'object' to the default partial variable. #8823 [Nick Retallack, Jeremy Kemper] diff --git a/actionpack/lib/action_controller/test_case.rb b/actionpack/lib/action_controller/test_case.rb new file mode 100644 index 0000000000..35aad0d8bf --- /dev/null +++ b/actionpack/lib/action_controller/test_case.rb @@ -0,0 +1,53 @@ +require 'active_support/test_case' + +module ActionController + class NonInferrableControllerError < ActionControllerError + def initialize(name) + super "Unable to determine the controller to test from #{name}. " + + "You'll need to specify it using tests YourController in your " + + "test case definition" + end + end + + class TestCase < ActiveSupport::TestCase + @@controller_class = nil + class << self + def tests(controller_class) + self.controller_class = controller_class + end + + def controller_class=(new_class) + prepare_controller_class(new_class) + write_inheritable_attribute(:controller_class, new_class) + end + + def controller_class + if current_controller_class = read_inheritable_attribute(:controller_class) + current_controller_class + else + self.controller_class= determine_default_controller_class(name) + end + end + + def determine_default_controller_class(name) + name.sub(/Test$/, '').constantize + rescue NameError + raise NonInferrableControllerError.new(name) + end + + def prepare_controller_class(new_class) + new_class.class_eval do + def rescue_action(e) + raise e + end + end + end + end + + def setup + @controller = self.class.controller_class.new + @request = TestRequest.new + @response = TestResponse.new + end + end +end
\ No newline at end of file diff --git a/actionpack/test/controller/test_test.rb b/actionpack/test/controller/test_test.rb index 305c5b6931..8fbe980eec 100644 --- a/actionpack/test/controller/test_test.rb +++ b/actionpack/test/controller/test_test.rb @@ -1,5 +1,6 @@ require "#{File.dirname(__FILE__)}/../abstract_unit" require "#{File.dirname(__FILE__)}/fake_controllers" +require "action_controller/test_case" class TestTest < Test::Unit::TestCase class TestController < ActionController::Base @@ -580,3 +581,34 @@ class CleanBacktraceTest < Test::Unit::TestCase assert !caught.backtrace.empty? end end + +class InferringClassNameTest < Test::Unit::TestCase + def test_determine_controller_class + assert_equal ContentController, determine_class("ContentControllerTest") + end + + def test_determine_controller_class_with_nonsense_name + assert_raises ActionController::NonInferrableControllerError do + determine_class("HelloGoodBye") + end + end + + def test_determine_controller_class_with_sensible_name_where_no_controller_exists + assert_raises ActionController::NonInferrableControllerError do + determine_class("NoControllerWithThisNameTest") + end + end + + private + def determine_class(name) + ActionController::TestCase.determine_default_controller_class(name) + end +end + +class CrazyNameTest < ActionController::TestCase + tests ContentController + def test_controller_class_can_be_set_manually_not_just_inferred + assert_equal ContentController, self.class.controller_class + end +end + |