提交 51278579 编写于 作者: A Aaron Patterson

Merge pull request #17014 from grosser/grosser/fast-fixtures

speed up fixtures by not loading all their classes
......@@ -870,34 +870,9 @@ def fixtures(*fixture_set_names)
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 @@ def setup_fixtures(config = ActiveRecord::Base)
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 @@ def load_fixtures(config)
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 @@ def test_foo
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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册