diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index fcb32681de0ffe0c104d293f123d31e59937af94..f0bf07e65b1afd1bf37b5d08cdf9bbd40c7e598b 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Make the Fixtures Test::Unit enhancements more supporting for double-loaded test cases. Closes #10379 [brynary] + * Fix that validates_acceptance_of still works for non-existent tables (useful for bootstrapping new databases). Closes #10474 [hasmanyjosh] * Ensure that the :uniq option for has_many :through associations retains the order. #10463 [remvee] diff --git a/activerecord/lib/active_record/fixtures.rb b/activerecord/lib/active_record/fixtures.rb index 7a00b5bb568eddaafae2896f1cf11deb67ebee62..0da8c514d7fd55372990c928e0a3b6a0bd36cb79 100755 --- a/activerecord/lib/active_record/fixtures.rb +++ b/activerecord/lib/active_record/fixtures.rb @@ -916,6 +916,8 @@ def use_transactional_fixtures? end def setup_with_fixtures + return if @fixtures_setup + @fixtures_setup = true return unless defined?(ActiveRecord::Base) && !ActiveRecord::Base.configurations.blank? if pre_loaded_fixtures && !use_transactional_fixtures @@ -947,6 +949,8 @@ def setup_with_fixtures alias_method :setup, :setup_with_fixtures def teardown_with_fixtures + return if @fixtures_teardown + @fixtures_teardown = true return unless defined?(ActiveRecord::Base) && !ActiveRecord::Base.configurations.blank? unless use_transactional_fixtures? @@ -963,24 +967,31 @@ def teardown_with_fixtures alias_method :teardown, :teardown_with_fixtures def self.method_added(method) + return if @__disable_method_added__ + @__disable_method_added__ = true + case method.to_s when 'setup' unless method_defined?(:setup_without_fixtures) alias_method :setup_without_fixtures, :setup - define_method(:setup) do + define_method(:full_setup) do setup_with_fixtures setup_without_fixtures end end + alias_method :setup, :full_setup when 'teardown' unless method_defined?(:teardown_without_fixtures) alias_method :teardown_without_fixtures, :teardown - define_method(:teardown) do + define_method(:full_teardown) do teardown_without_fixtures teardown_with_fixtures end end + alias_method :teardown, :full_teardown end + + @__disable_method_added__ = false end private diff --git a/activerecord/test/fixtures_test.rb b/activerecord/test/fixtures_test.rb index c1e79b807f427b6a8fcfa3a698e771e7e4cd146f..deeb391e3ad86c8f0ad5ac9a941a7bdf99857ca6 100755 --- a/activerecord/test/fixtures_test.rb +++ b/activerecord/test/fixtures_test.rb @@ -324,6 +324,22 @@ def test_fixture_table_names end end +# This is to reproduce a bug where if a TestCase is loaded +# twice by Ruby, it loses its fixture setup hook. +class_def = <<-CODE + class DoubleLoadedTestCase < Test::Unit::TestCase + fixtures :topics + + def setup + end + + def test_should_properly_setup_fixtures + assert_nothing_raised { topics(:first) } + end + end +CODE +2.times { eval(class_def) } + class OverlappingFixturesTest < Test::Unit::TestCase fixtures :topics, :developers fixtures :developers, :accounts