aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack
diff options
context:
space:
mode:
authorMichael Koziarski <michael@koziarski.com>2007-10-26 02:21:21 +0000
committerMichael Koziarski <michael@koziarski.com>2007-10-26 02:21:21 +0000
commit2cc0cac3efce92bf9d0e8636f2889c37ca9f57ab (patch)
tree3ad613f6c73cd9fef243f7586dfcf3b6f329105b /actionpack
parent2bfd6772a4f3f9e0ff395cfd415dafbc1c9dec80 (diff)
downloadrails-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/CHANGELOG2
-rw-r--r--actionpack/lib/action_controller/test_case.rb53
-rw-r--r--actionpack/test/controller/test_test.rb32
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
+