Module: ActionController::Integration::Runner

Included in:
ActionController::IntegrationTest
Defined in:
lib/action_controller/integration.rb

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(sym, *args, &block) ⇒ Object

Delegate unhandled messages to the current session instance.



544
545
546
547
548
549
# File 'lib/action_controller/integration.rb', line 544

def method_missing(sym, *args, &block)
  reset! unless @integration_session
  returning @integration_session.__send__(sym, *args, &block) do
    copy_session_variables!
  end
end

Instance Method Details

#copy_session_variables!Object

Copy the instance variables from the current session instance into the test instance.



536
537
538
539
540
541
# File 'lib/action_controller/integration.rb', line 536

def copy_session_variables! #:nodoc:
  return unless @integration_session
  %w(controller response request).each do |var|
    instance_variable_set("@#{var}", @integration_session.__send__(var))
  end
end

#open_session(application = nil) {|session| ... } ⇒ Object

Open a new session instance. If a block is given, the new session is yielded to the block before being returned.

session = open_session do |sess|
  sess.extend(CustomAssertions)
end

By default, a single session is automatically created for you, but you can use this method to open multiple sessions that ought to be tested simultaneously.

Yields:

  • (session)


507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
# File 'lib/action_controller/integration.rb', line 507

def open_session(application = nil)
  session = Integration::Session.new(application)

  # delegate the fixture accessors back to the test instance
  extras = Module.new { attr_accessor :delegate, :test_result }
  if self.class.respond_to?(:fixture_table_names)
    self.class.fixture_table_names.each do |table_name|
      name = table_name.tr(".", "_")
      next unless respond_to?(name)
      extras.__send__(:define_method, name) { |*args|
        delegate.send(name, *args)
      }
    end
  end

  # delegate add_assertion to the test case
  extras.__send__(:define_method, :add_assertion) {
    test_result.add_assertion
  }
  session.extend(extras)
  session.delegate = self
  session.test_result = @_result

  yield session if block_given?
  session
end

#reset!Object

Reset the current session. This is useful for testing multiple sessions in a single test case.



481
482
483
# File 'lib/action_controller/integration.rb', line 481

def reset!
  @integration_session = open_session
end