mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #17014 from grosser/grosser/fast-fixtures
speed up fixtures by not loading all their classes
This commit is contained in:
commit
5127857947
3 changed files with 2 additions and 66 deletions
|
@ -870,34 +870,9 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
self.fixture_table_names |= fixture_set_names
|
||||
require_fixture_classes(fixture_set_names, self.config)
|
||||
setup_fixture_accessors(fixture_set_names)
|
||||
end
|
||||
|
||||
def try_to_load_dependency(file_name)
|
||||
require_dependency file_name
|
||||
rescue LoadError => e
|
||||
unless fixture_class_names.key?(file_name.pluralize)
|
||||
if ActiveRecord::Base.logger
|
||||
ActiveRecord::Base.logger.warn("Unable to load #{file_name}, make sure you added it to ActiveSupport::TestCase.set_fixture_class")
|
||||
ActiveRecord::Base.logger.warn("underlying cause #{e.message} \n\n #{e.backtrace.join("\n")}")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def require_fixture_classes(fixture_set_names = nil, config = ActiveRecord::Base)
|
||||
if fixture_set_names
|
||||
fixture_set_names = fixture_set_names.map { |n| n.to_s }
|
||||
else
|
||||
fixture_set_names = fixture_table_names
|
||||
end
|
||||
|
||||
fixture_set_names.each do |file_name|
|
||||
file_name = file_name.singularize if config.pluralize_table_names
|
||||
try_to_load_dependency(file_name)
|
||||
end
|
||||
end
|
||||
|
||||
def setup_fixture_accessors(fixture_set_names = nil)
|
||||
fixture_set_names = Array(fixture_set_names || fixture_table_names)
|
||||
methods = Module.new do
|
||||
|
@ -974,7 +949,7 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
# Instantiate fixtures for every test if requested.
|
||||
instantiate_fixtures(config) if use_instantiated_fixtures
|
||||
instantiate_fixtures if use_instantiated_fixtures
|
||||
end
|
||||
|
||||
def teardown_fixtures
|
||||
|
@ -1001,16 +976,9 @@ module ActiveRecord
|
|||
Hash[fixtures.map { |f| [f.name, f] }]
|
||||
end
|
||||
|
||||
# for pre_loaded_fixtures, only require the classes once. huge speed improvement
|
||||
@@required_fixture_classes = false
|
||||
|
||||
def instantiate_fixtures(config)
|
||||
def instantiate_fixtures
|
||||
if pre_loaded_fixtures
|
||||
raise RuntimeError, 'Load fixtures before instantiating them.' if ActiveRecord::FixtureSet.all_loaded_fixtures.empty?
|
||||
unless @@required_fixture_classes
|
||||
self.class.require_fixture_classes ActiveRecord::FixtureSet.all_loaded_fixtures.keys, config
|
||||
@@required_fixture_classes = true
|
||||
end
|
||||
ActiveRecord::FixtureSet.instantiate_all_loaded_fixtures(self, load_instances?)
|
||||
else
|
||||
raise RuntimeError, 'Load fixtures before instantiating them.' if @loaded_fixtures.nil?
|
||||
|
|
|
@ -822,25 +822,6 @@ class ActiveSupportSubclassWithFixturesTest < ActiveRecord::TestCase
|
|||
end
|
||||
end
|
||||
|
||||
class FixtureLoadingTest < ActiveRecord::TestCase
|
||||
def test_logs_message_for_failed_dependency_load
|
||||
ActiveRecord::Base.logger.expects(:warn).twice
|
||||
ActiveRecord::TestCase.try_to_load_dependency('does_not_exist')
|
||||
end
|
||||
|
||||
def test_does_not_logs_message_for_dependency_that_has_been_defined_with_set_fixture_class
|
||||
ActiveRecord::TestCase.set_fixture_class unknown_dead_parrots: DeadParrot
|
||||
ActiveRecord::Base.logger.expects(:warn).never
|
||||
ActiveRecord::TestCase.try_to_load_dependency('unknown_dead_parrot')
|
||||
end
|
||||
|
||||
def test_does_not_logs_message_for_successful_dependency_load
|
||||
ActiveRecord::TestCase.expects(:require_dependency).with('works_out_fine')
|
||||
ActiveRecord::Base.logger.expects(:warn).never
|
||||
ActiveRecord::TestCase.try_to_load_dependency('works_out_fine')
|
||||
end
|
||||
end
|
||||
|
||||
class CustomNameForFixtureOrModelTest < ActiveRecord::TestCase
|
||||
ActiveRecord::FixtureSet.reset_cache
|
||||
|
||||
|
|
|
@ -136,19 +136,6 @@ def disable_extension!(extension, connection)
|
|||
connection.reconnect!
|
||||
end
|
||||
|
||||
unless ENV['FIXTURE_DEBUG']
|
||||
module ActiveRecord::TestFixtures::ClassMethods
|
||||
def try_to_load_dependency_with_silence(*args)
|
||||
old = ActiveRecord::Base.logger.level
|
||||
ActiveRecord::Base.logger.level = ActiveSupport::Logger::ERROR
|
||||
try_to_load_dependency_without_silence(*args)
|
||||
ActiveRecord::Base.logger.level = old
|
||||
end
|
||||
|
||||
alias_method_chain :try_to_load_dependency, :silence
|
||||
end
|
||||
end
|
||||
|
||||
require "cases/validations_repair_helper"
|
||||
class ActiveSupport::TestCase
|
||||
include ActiveRecord::TestFixtures
|
||||
|
|
Loading…
Reference in a new issue