Skip to content
Browse files

Improve overview for ActionController::TestCase.

  • Loading branch information...
1 parent 5508bfd commit 03afe79dd8ea8ad968c4921c233aacc7eca02f5a @FooBarWidget FooBarWidget committed Jul 18, 2008
Showing with 51 additions and 12 deletions.
  1. +50 −12 actionpack/lib/action_controller/test_case.rb
  2. +1 −0 actionpack/lib/action_controller/test_process.rb
View
62 actionpack/lib/action_controller/test_case.rb
@@ -15,23 +15,61 @@ def inferred_controller_name
end
end
- # Superclass for Action Controller functional tests. Infers the controller under test from the test class name,
- # and creates @controller, @request, @response instance variables.
+ # Superclass for ActionController functional tests. Functional tests allow you to
+ # test a single controller action per test method. This should not be confused with
+ # integration tests (see ActionController::IntegrationTest), which are more like
+ # "stories" that can involve multiple controllers and mutliple actions (i.e. multiple
+ # different HTTP requests).
#
- # class WidgetsControllerTest < ActionController::TestCase
- # def test_index
- # get :index
+ # == Basic example
+ #
+ # Functional tests are written as follows:
+ # 1. First, one uses the +get+, +post+, +put+, +delete+ or +head+ method to simulate
+ # an HTTP request.
+ # 2. Then, one asserts whether the current state is as expected. "State" can be anything:
+ # the controller's HTTP response, the database contents, etc.
+ #
+ # For example:
+ #
+ # class BooksControllerTest < ActionController::TestCase
+ # def test_create
+ # # Simulate a POST response with the given HTTP parameters.
+ # post(:create, :book => { :title => "Love Hina" })
+ #
+ # # Assert that the controller tried to redirect us to
+ # # the created book's URI.
+ # assert_response :found
+ #
+ # # Assert that the controller really put the book in the database.
+ # assert_not_nil Book.find_by_title("Love Hina")
# end
# end
#
- # * @controller - WidgetController.new
- # * @request - ActionController::TestRequest.new
- # * @response - ActionController::TestResponse.new
+ # == Special instance variables
+ #
+ # ActionController::TestCase will also automatically provide the following instance
+ # variables for use in the tests:
+ #
+ # <b>@controller</b>::
+ # The controller instance that will be tested.
+ # <b>@request</b>::
+ # An ActionController::TestRequest, representing the current HTTP
+ # request. You can modify this object before sending the HTTP request. For example,
+ # you might want to set some session properties before sending a GET request.
+ # <b>@response</b>::
+ # An ActionController::TestResponse object, representing the response
+ # of the last HTTP response. In the above example, <tt>@response</tt> becomes valid
+ # after calling +post+. If the various assert methods are not sufficient, then you
+ # may use this object to inspect the HTTP response in detail.
+ #
+ # (Earlier versions of Rails required each functional test to subclass
+ # Test::Unit::TestCase and define @controller, @request, @response in +setup+.)
#
- # (Earlier versions of Rails required each functional test to subclass Test::Unit::TestCase and define
- # @controller, @request, @response in +setup+.)
+ # == Controller is automatically inferred
#
- # If the controller cannot be inferred from the test class name, you can explicity set it with +tests+.
+ # ActionController::TestCase will automatically infer the controller under test
+ # from the test class name. If the controller cannot be inferred from the test
+ # class name, you can explicity set it with +tests+.
#
# class SpecialEdgeCaseWidgetsControllerTest < ActionController::TestCase
# tests WidgetController
@@ -103,4 +141,4 @@ def rescue_action_in_public!
@request.remote_addr = '208.77.188.166' # example.com
end
end
-end
+end
View
1 actionpack/lib/action_controller/test_process.rb
@@ -361,6 +361,7 @@ def method_missing(method_name, *args, &block) #:nodoc:
module TestProcess
def self.included(base)
# execute the request simulating a specific HTTP method and set/volley the response
+ # TODO: this should be un-DRY'ed for the sake of API documentation.
%w( get post put delete head ).each do |method|
base.class_eval <<-EOV, __FILE__, __LINE__
def #{method}(action, parameters = nil, session = nil, flash = nil)

0 comments on commit 03afe79

Please sign in to comment.
Something went wrong with that request. Please try again.