File: active_support/testing/setup_and_teardown.rb

Overview
Module Structure
Code

Overview

Module Structure

  module: <Toplevel Module>
  module: ActiveSupport#3
  module: Testing#4
  module: SetupAndTeardown#5
includes
  ForClassicTestUnit ( Unknown-Module )
  ForMiniTest ( Unknown-Module )
  Callbacks ( ActiveSupport )
has properties
module method: included / 1 #6
  module: ForMiniTest#19
has properties
method: run / 1 #20
  module: ForClassicTestUnit#38
has properties
constant: PASSTHROUGH_EXCEPTIONS #40
method: run / 1 #44

Code

   1  require 'active_support/callbacks'
   2 
   3  module ActiveSupport
   4    module Testing
   5      module SetupAndTeardown
   6        def self.included(base)
   7          base.class_eval do
   8            include ActiveSupport::Callbacks
   9            define_callbacks :setup, :teardown
  10 
  11            if defined?(MiniTest::Assertions) && TestCase < MiniTest::Assertions
  12              include ForMiniTest
  13            else
  14              include ForClassicTestUnit
  15            end
  16          end
  17        end
  18 
  19        module ForMiniTest
  20          def run(runner)
  21            result = '.'
  22            begin
  23              run_callbacks :setup
  24              result = super
  25            rescue Exception => e
  26              result = runner.puke(self.class, __name__, e)
  27            ensure
  28              begin
  29                run_callbacks :teardown, :enumerator => :reverse_each
  30              rescue Exception => e
  31                result = runner.puke(self.class, __name__, e)
  32              end
  33            end
  34            result
  35          end
  36        end
  37 
  38        module ForClassicTestUnit
  39          # For compatibility with Ruby < 1.8.6
  40          PASSTHROUGH_EXCEPTIONS = Test::Unit::TestCase::PASSTHROUGH_EXCEPTIONS rescue [NoMemoryError, SignalException, Interrupt, SystemExit]
  41 
  42          # This redefinition is unfortunate but test/unit shows us no alternative.
  43          # Doubly unfortunate: hax to support Mocha's hax.
  44          def run(result)
  45            return if @method_name.to_s == "default_test"
  46 
  47            if using_mocha = respond_to?(:mocha_verify)
  48              assertion_counter_klass = if defined?(Mocha::TestCaseAdapter::AssertionCounter)
  49                                          Mocha::TestCaseAdapter::AssertionCounter
  50                                        else
  51                                          Mocha::Integration::TestUnit::AssertionCounter
  52                                        end
  53              assertion_counter = assertion_counter_klass.new(result)
  54            end
  55 
  56            yield(Test::Unit::TestCase::STARTED, name)
  57            @_result = result
  58            begin
  59              begin
  60                run_callbacks :setup
  61                setup
  62                __send__(@method_name)
  63                mocha_verify(assertion_counter) if using_mocha
  64              rescue Mocha::ExpectationError => e
  65                add_failure(e.message, e.backtrace)
  66              rescue Test::Unit::AssertionFailedError => e
  67                add_failure(e.message, e.backtrace)
  68              rescue Exception => e
  69                raise if PASSTHROUGH_EXCEPTIONS.include?(e.class)
  70                add_error(e)
  71              ensure
  72                begin
  73                  teardown
  74                  run_callbacks :teardown, :enumerator => :reverse_each
  75                rescue Test::Unit::AssertionFailedError => e
  76                  add_failure(e.message, e.backtrace)
  77                rescue Exception => e
  78                  raise if PASSTHROUGH_EXCEPTIONS.include?(e.class)
  79                  add_error(e)
  80                end
  81              end
  82            ensure
  83              mocha_teardown if using_mocha
  84            end
  85            result.add_run
  86            yield(Test::Unit::TestCase::FINISHED, name)
  87          end
  88        end
  89      end
  90    end
  91  end