# class ActionDispatch::IntegrationTest

An integration test spans multiple controllers and actions, tying them all together to ensure they work together as expected. It tests more completely than either unit or functional tests do, exercising the entire stack, from the dispatcher to the database.

At its simplest, you simply extend `IntegrationTest` and write your tests using the get/post methods:

    require "test_helper"

    class ExampleTest < ActionDispatch::IntegrationTest
      fixtures :people

      def test_login
        # get the login page
        get "/login"
        assert_equal 200, status

        # post the login and follow through to the home page
        post "/login", :username => people(:jamis).username,
          :password => people(:jamis).password
        follow_redirect!
        assert_equal 200, status
        assert_equal "/home", path
      end
    end

However, you can also have multiple session instances open per test, and even extend those instances with assertions and methods to create a very powerful testing DSL that is specific for your application. You can even reference any named routes you happen to have defined.

    require "test_helper"

    class AdvancedTest < ActionDispatch::IntegrationTest
      fixtures :people, :rooms

      def test_login_and_speak
        jamis, david = login(:jamis), login(:david)
        room = rooms(:office)

        jamis.enter(room)
        jamis.speak(room, "anybody home?")

        david.enter(room)
        david.speak(room, "hello!")
      end

      private

        module CustomAssertions
          def enter(room)
            # reference a named route, for maximum internal consistency!
            get(room_url(:id => room.id))
            assert(...)
            ...
          end

          def speak(room, message)
            xml_http_request "/say/#{room.id}", :message => message
            assert(...)
            ...
          end
        end

        def login(who)
          open_session do |sess|
            sess.extend(CustomAssertions)
            who = people(who)
            sess.post "/login", :username => who.username,
              :password => who.password
            assert(...)
          end
        end
    end

### Public Class Methods

app() click to toggle source

    # File lib/action_dispatch/testing/integration.rb, line 479
    def self.app
      # DEPRECATE Rails application fallback
      # This should be set by the initializer
      @@app || (defined?(Rails.application) && Rails.application) || nil
    end

app=(app) click to toggle source

    # File lib/action_dispatch/testing/integration.rb, line 485
    def self.app=(app)
      @@app = app
    end

### Public Instance Methods

app() click to toggle source
Calls superclass method ActionDispatch::Integration::Runner#app

    # File lib/action_dispatch/testing/integration.rb, line 489
    def app
      super || self.class.app
    end

url_options() click to toggle source

    # File lib/action_dispatch/testing/integration.rb, line 493
    def url_options
      reset! unless integration_session
      integration_session.url_options
    end