Class: ActionController::IntegrationTest

Inherits:
Test::Unit::TestCase show all
Includes:
ActionController::Integration::Runner
Defined in:
lib/action_controller/integration.rb

Overview

An IntegrationTest is one that 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 "#{File.dirname(__FILE__)}/test_helper"

class ExampleTest < ActionController::IntegrationTest
fixtures :people

def 
  # 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 "#{File.dirname(__FILE__)}/test_helper"

class AdvancedTest < ActionController::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

Constant Summary

Constants included from Assertions

Assertions::NO_STRIP

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ActionController::Integration::Runner

#copy_session_variables!, #method_missing, #open_session, #reset!

Methods included from TestProcess

#assigns, #build_request_uri, #cookies, #find_all_tag, #find_tag, #fixture_file_upload, #flash, #follow_redirect, #html_document, included, #method_missing, #process, #redirect_to_url, #session, #with_routing, #xml_http_request

Methods included from Assertions

#clean_backtrace, included

Constructor Details

#initialize(name) ⇒ IntegrationTest

Work around a bug in test/unit caused by the default test being named as a symbol (:default_test), which causes regex test filters (like "ruby test.rb -n /foo/") to fail because =~ doesn't work on symbols.



590
591
592
# File 'lib/action_controller/integration.rb', line 590

def initialize(name) #:nodoc:
  super(name.to_s)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class ActionController::Integration::Runner

Class Method Details

.use_instantiated_fixturesObject

:nodoc:



627
628
629
630
631
# File 'lib/action_controller/integration.rb', line 627

def use_instantiated_fixtures #:nodoc:
  @_use_instantiated_fixtures ?
    @use_instantiated_fixtures :
    superclass.use_instantiated_fixtures
end

.use_instantiated_fixtures=(flag) ⇒ Object

:nodoc:



616
617
618
619
# File 'lib/action_controller/integration.rb', line 616

def use_instantiated_fixtures=(flag) #:nodoc:
  @_use_instantiated_fixtures = true
  @use_instantiated_fixtures = flag
end

.use_transactional_fixturesObject

:nodoc:



621
622
623
624
625
# File 'lib/action_controller/integration.rb', line 621

def use_transactional_fixtures #:nodoc:
  @_use_transactional_fixtures ?
    @use_transactional_fixtures :
    superclass.use_transactional_fixtures
end

.use_transactional_fixtures=(flag) ⇒ Object

:nodoc:



611
612
613
614
# File 'lib/action_controller/integration.rb', line 611

def use_transactional_fixtures=(flag) #:nodoc:
  @_use_transactional_fixtures = true
  @use_transactional_fixtures = flag
end

Instance Method Details

#run(*args) ⇒ Object

Work around test/unit's requirement that every subclass of TestCase have at least one test method. Note that this implementation extends to all subclasses, as well, so subclasses of IntegrationTest may also exist without any test methods.



598
599
600
601
# File 'lib/action_controller/integration.rb', line 598

def run(*args) #:nodoc:
  return if @method_name == "default_test"
  super
end