module ActionController::TestCase::Behavior - actionpack-4.2.4 Documentation

# module ActionController::TestCase::Behavior

### Attributes

request[R]
response[R]

### Public Instance Methods

build_request() click to toggle source

    # File lib/action_controller/test_case.rb, line 683
    def build_request
      TestRequest.new
    end

build_response(klass) click to toggle source

    # File lib/action_controller/test_case.rb, line 687
    def build_response(klass)
      klass.new
    end

delete(action, *args) click to toggle source

Simulate a DELETE request with the given parameters and set/volley the response. See `get` for more details.

    # File lib/action_controller/test_case.rb, line 535
    def delete(action, *args)
      process(action, "DELETE", *args)
    end

get(action, *args) click to toggle source

Simulate a GET request with the given parameters.

- `action`: The controller action to call.

- `parameters`: The HTTP parameters that you want to pass. This may be `nil`, a hash, or a string that is appropriately encoded (`application/x-www-form-urlencoded` or `multipart/form-data`).

- `session`: A hash of parameters to store in the session. This may be `nil`.

- `flash`: A hash of parameters to store in the flash. This may be `nil`.

You can also simulate POST, PATCH, PUT, DELETE, and HEAD requests with `post`, `patch`, `put`, `delete`, and `head`.

Note that the request method is not verified. The different methods are available to make the tests more expressive.

    # File lib/action_controller/test_case.rb, line 511
    def get(action, *args)
      process(action, "GET", *args)
    end

head(action, *args) click to toggle source

Simulate a HEAD request with the given parameters and set/volley the response. See `get` for more details.

    # File lib/action_controller/test_case.rb, line 541
    def head(action, *args)
      process(action, "HEAD", *args)
    end

paramify_values(hash_or_array_or_value) click to toggle source

    # File lib/action_controller/test_case.rb, line 555
    def paramify_values(hash_or_array_or_value)
      case hash_or_array_or_value
      when Hash
        Hash[hash_or_array_or_value.map{|key, value| [key, paramify_values(value)] }]
      when Array
        hash_or_array_or_value.map {|i| paramify_values(i)}
      when Rack::Test::UploadedFile, ActionDispatch::Http::UploadedFile
        hash_or_array_or_value
      else
        hash_or_array_or_value.to_param
      end
    end

patch(action, *args) click to toggle source

Simulate a PATCH request with the given parameters and set/volley the response. See `get` for more details.

    # File lib/action_controller/test_case.rb, line 523
    def patch(action, *args)
      process(action, "PATCH", *args)
    end

post(action, *args) click to toggle source

Simulate a POST request with the given parameters and set/volley the response. See `get` for more details.

    # File lib/action_controller/test_case.rb, line 517
    def post(action, *args)
      process(action, "POST", *args)
    end

process(action, http_method = 'GET', *args) click to toggle source

Simulate a HTTP request to `action` by specifying request method, parameters and set/volley the response.

- `action`: The controller action to call.

- `http_method`: Request method used to send the http request. Possible values are `GET`, `POST`, `PATCH`, `PUT`, `DELETE`, `HEAD`. Defaults to `GET`.

- `parameters`: The HTTP parameters. This may be `nil`, a hash, or a string that is appropriately encoded (`application/x-www-form-urlencoded` or `multipart/form-data`).

- `session`: A hash of parameters to store in the session. This may be `nil`.

- `flash`: A hash of parameters to store in the flash. This may be `nil`.

Example calling `create` action and sending two params:

    process :create, 'POST', user: { name: 'Gaurish Sharma', email: 'user@example.com' }

Example sending parameters, `nil` session and setting a flash message:

    process :view, 'GET', { id: 7 }, nil, { notice: 'This is flash message' }

To simulate `GET`, `POST`, `PATCH`, `PUT`, `DELETE` and `HEAD` requests prefer using get, post, patch, put, delete and head methods respectively which will make tests more expressive.

Note that the request method is not verified.

    # File lib/action_controller/test_case.rb, line 593
    def process(action, http_method = 'GET', *args)
      check_required_ivars

      if args.first.is_a?(String) && http_method != 'HEAD'
        @request.env['RAW_POST_DATA'] = args.shift
      end

      parameters, session, flash = args
      parameters ||= {}

      # Ensure that numbers and symbols passed as params are converted to
      # proper params, as is the case when engaging rack.
      parameters = paramify_values(parameters) if html_format?(parameters)

      @html_document = nil
      @html_scanner_document = nil

      unless @controller.respond_to?(:recycle!)
        @controller.extend(Testing::Functional)
      end

      @request.recycle!
      @response.recycle!
      @controller.recycle!

      @request.env['REQUEST_METHOD'] = http_method

      controller_class_name = @controller.class.anonymous? ?
        "anonymous" :
        @controller.class.controller_path

      @request.assign_parameters(@routes, controller_class_name, action.to_s, parameters)

      @request.session.update(session) if session
      @request.flash.update(flash || {})

      @controller.request  = @request
      @controller.response = @response

      build_request_uri(action, parameters)

      name = @request.parameters[:action]

      @controller.recycle!
      @controller.process(name)

      if cookies = @request.env['action_dispatch.cookies']
        unless @response.committed?
          cookies.write(@response)
        end
      end
      @response.prepare!

      @assigns = @controller.respond_to?(:view_assigns) ? @controller.view_assigns : {}

      if flash_value = @request.flash.to_session_value
        @request.session['flash'] = flash_value
      end

      @response
    end

put(action, *args) click to toggle source

Simulate a PUT request with the given parameters and set/volley the response. See `get` for more details.

    # File lib/action_controller/test_case.rb, line 529
    def put(action, *args)
      process(action, "PUT", *args)
    end

setup_controller_request_and_response() click to toggle source

    # File lib/action_controller/test_case.rb, line 655
    def setup_controller_request_and_response
      @controller = nil unless defined? @controller

      response_klass = TestResponse

      if klass = self.class.controller_class
        if klass < ActionController::Live
          response_klass = LiveTestResponse
        end
        unless @controller
          begin
            @controller = klass.new
          rescue
            warn "could not construct controller #{klass}" if $VERBOSE
          end
        end
      end

      @request          = build_request
      @response         = build_response response_klass
      @response.request = @request

      if @controller
        @controller.request = @request
        @controller.params = {}
      end
    end

xhr(request_method, action, parameters = nil, session = nil, flash = nil)
Alias for: xml_http_request
xml_http_request(request_method, action, parameters = nil, session = nil, flash = nil) click to toggle source

    # File lib/action_controller/test_case.rb, line 545
    def xml_http_request(request_method, action, parameters = nil, session = nil, flash = nil)
      @request.env['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
      @request.env['HTTP_ACCEPT'] ||=  [Mime::JS, Mime::HTML, Mime::XML, 'text/xml', Mime::ALL].join(', ')
      __send__(request_method, action, parameters, session, flash).tap do
        @request.env.delete 'HTTP_X_REQUESTED_WITH'
        @request.env.delete 'HTTP_ACCEPT'
      end
    end

Also aliased as: xhr

### Private Instance Methods

build_request_uri(action, parameters) click to toggle source

    # File lib/action_controller/test_case.rb, line 714
          def build_request_uri(action, parameters)
            unless @request.env["PATH_INFO"]
              options = @controller.respond_to?(:url_options) ? @controller.__send__(:url_options).merge(parameters) : parameters
              options.update(
                :action => action,
                :relative_url_root => nil,
                :_recall => @request.path_parameters)

              if route_name = options.delete(:use_route)
                ActiveSupport::Deprecation.warn "              Passing the `use_route` option in functional tests are deprecated.
                  Support for this option in the `process` method (and the related
                  `get`, `head`, `post`, `patch`, `put` and `delete` helpers) will
                  be removed in the next version without replacement.

                  Functional tests are essentially unit tests for controllers and
                  they should not require knowledge to how the application's routes
                  are configured. Instead, you should explicitly pass the appropiate
                  params to the `process` method.

                  Previously the engines guide also contained an incorrect example
                  that recommended using this option to test an engine's controllers
                  within the dummy application. That recommendation was incorrect
                  and has since been corrected. Instead, you should override the
                  `@routes` variable in the test case with `Foo::Engine.routes`. See
                  the updated engines guide for details.
    ".squish
              end

              url, query_string = @routes.path_for(options, route_name).split("?", 2)

              @request.env["SCRIPT_NAME"] = @controller.config.relative_url_root
              @request.env["PATH_INFO"] = url
              @request.env["QUERY_STRING"] = query_string || ""
            end
          end

check_required_ivars() click to toggle source

    # File lib/action_controller/test_case.rb, line 704
    def check_required_ivars
      # Sanity check for required instance variables so we can give an
      # understandable error message.
      [:@routes, :@controller, :@request, :@response].each do |iv_name|
        if !instance_variable_defined?(iv_name) || instance_variable_get(iv_name).nil?
          raise "#{iv_name} is nil: make sure you set it in your test's setup method."
        end
      end
    end

document_root_element() click to toggle source

    # File lib/action_controller/test_case.rb, line 700
    def document_root_element
      html_document.root
    end

html_format?(parameters) click to toggle source

    # File lib/action_controller/test_case.rb, line 751
    def html_format?(parameters)
      return true unless parameters.key?(:format)
      Mime.fetch(parameters[:format]) { Mime['html'] }.html?
    end