Module: ActiveRecord::TestFixtures

Extended by:
ActiveSupport::Concern
Defined in:
lib/active_record/fixtures.rb

Defined Under Namespace

Modules: ClassMethods

Instance Method Summary collapse

Instance Method Details

#after_teardownObject



828
829
830
831
# File 'lib/active_record/fixtures.rb', line 828

def after_teardown
  super
  teardown_fixtures
end

#before_setupObject



823
824
825
826
# File 'lib/active_record/fixtures.rb', line 823

def before_setup
  setup_fixtures
  super
end

#enlist_fixture_connectionsObject



971
972
973
# File 'lib/active_record/fixtures.rb', line 971

def enlist_fixture_connections
  ActiveRecord::Base.connection_handler.connection_pool_list.map(&:connection)
end

#run_in_transaction?Boolean

Returns:

  • (Boolean)


920
921
922
923
# File 'lib/active_record/fixtures.rb', line 920

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

#setup_fixtures(config = ActiveRecord::Base) ⇒ Object



925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
# File 'lib/active_record/fixtures.rb', line 925

def setup_fixtures(config = ActiveRecord::Base)
  if pre_loaded_fixtures && !use_transactional_fixtures
    raise RuntimeError, 'pre_loaded_fixtures requires use_transactional_fixtures'
  end

  @fixture_cache = {}
  @fixture_connections = []
  @@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
      @loaded_fixtures = load_fixtures(config)
      @@already_loaded_fixtures[self.class] = @loaded_fixtures
    end
    @fixture_connections = enlist_fixture_connections
    @fixture_connections.each do |connection|
      connection.begin_transaction joinable: false
    end
  # Load fixtures for every test.
  else
    ActiveRecord::FixtureSet.reset_cache
    @@already_loaded_fixtures[self.class] = nil
    @loaded_fixtures = load_fixtures(config)
  end

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

#teardown_fixturesObject



957
958
959
960
961
962
963
964
965
966
967
968
969
# File 'lib/active_record/fixtures.rb', line 957

def teardown_fixtures
  # Rollback changes if a transaction is active.
  if run_in_transaction?
    @fixture_connections.each do |connection|
      connection.rollback_transaction if connection.transaction_open?
    end
    @fixture_connections.clear
  else
    ActiveRecord::FixtureSet.reset_cache
  end

  ActiveRecord::Base.clear_active_connections!
end