Module: ActiveRecord::TestFixtures

Defined in:
lib/active_record/fixtures.rb

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
# File 'lib/active_record/fixtures.rb', line 811

def self.included(base)
  base.class_eval do
    setup :setup_fixtures
    teardown :teardown_fixtures

    superclass_delegating_accessor :fixture_path
    superclass_delegating_accessor :fixture_table_names
    superclass_delegating_accessor :fixture_class_names
    superclass_delegating_accessor :use_transactional_fixtures
    superclass_delegating_accessor :use_instantiated_fixtures   # true, false, or :no_instances
    superclass_delegating_accessor :pre_loaded_fixtures

    self.fixture_table_names = []
    self.use_transactional_fixtures = false
    self.use_instantiated_fixtures = true
    self.pre_loaded_fixtures = false

    self.fixture_class_names = {}
  end

  base.extend ClassMethods
end

Instance Method Details

#run_in_transaction?Boolean

Returns:

  • (Boolean)


909
910
911
912
# File 'lib/active_record/fixtures.rb', line 909

def run_in_transaction?
  use_transactional_fixtures &&
    !self.class.uses_transaction?(method_name)
end

#setup_fixturesObject



914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
# File 'lib/active_record/fixtures.rb', line 914

def setup_fixtures
  return unless defined?(ActiveRecord) && !ActiveRecord::Base.configurations.blank?

  if pre_loaded_fixtures && !use_transactional_fixtures
    raise RuntimeError, 'pre_loaded_fixtures requires use_transactional_fixtures'
  end

  @fixture_cache = {}
  @@already_loaded_fixtures ||= {}

  # Load fixtures once and begin transaction.
  if run_in_transaction?
    if @@already_loaded_fixtures[self.class]
      @loaded_fixtures = @@already_loaded_fixtures[self.class]
    else
      load_fixtures
      @@already_loaded_fixtures[self.class] = @loaded_fixtures
    end
    ActiveRecord::Base.connection.increment_open_transactions
    ActiveRecord::Base.connection.transaction_joinable = false
    ActiveRecord::Base.connection.begin_db_transaction
  # Load fixtures for every test.
  else
    Fixtures.reset_cache
    @@already_loaded_fixtures[self.class] = nil
    load_fixtures
  end

  # Instantiate fixtures for every test if requested.
  instantiate_fixtures if use_instantiated_fixtures
end

#teardown_fixturesObject



946
947
948
949
950
951
952
953
954
955
956
957
958
959
# File 'lib/active_record/fixtures.rb', line 946

def teardown_fixtures
  return unless defined?(ActiveRecord) && !ActiveRecord::Base.configurations.blank?

  unless run_in_transaction?
    Fixtures.reset_cache
  end

  # Rollback changes if a transaction is active.
  if run_in_transaction? && ActiveRecord::Base.connection.open_transactions != 0
    ActiveRecord::Base.connection.rollback_db_transaction
    ActiveRecord::Base.connection.decrement_open_transactions
  end
  ActiveRecord::Base.clear_active_connections!
end