mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
scrub instance variables from test cases on teardown
this prevents test state from accumulating, resulting in leaked objects and slow tests due to overactive GC.
This commit is contained in:
parent
7938039548
commit
79a06225ef
4 changed files with 41 additions and 2 deletions
|
@ -6,6 +6,7 @@ require 'active_support/testing/declarative'
|
||||||
require 'active_support/testing/pending'
|
require 'active_support/testing/pending'
|
||||||
require 'active_support/testing/isolation'
|
require 'active_support/testing/isolation'
|
||||||
require 'active_support/core_ext/kernel/reporting'
|
require 'active_support/core_ext/kernel/reporting'
|
||||||
|
require 'active_support/testing/garbage_collection'
|
||||||
|
|
||||||
begin
|
begin
|
||||||
silence_warnings { require 'mocha' }
|
silence_warnings { require 'mocha' }
|
||||||
|
@ -37,5 +38,6 @@ module ActiveSupport
|
||||||
include ActiveSupport::Testing::Deprecation
|
include ActiveSupport::Testing::Deprecation
|
||||||
include ActiveSupport::Testing::Pending
|
include ActiveSupport::Testing::Pending
|
||||||
extend ActiveSupport::Testing::Declarative
|
extend ActiveSupport::Testing::Declarative
|
||||||
|
include ActiveSupport::Testing::GarbageCollection
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
module ActiveSupport
|
||||||
|
module Testing
|
||||||
|
module GarbageCollection
|
||||||
|
def self.included(base)
|
||||||
|
base.teardown :scrub_leftover_instance_variables
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
RESERVED_INSTANCE_VARIABLES = %w(@test_passed @passed @method_name @__name__ @_result).map(&:to_sym)
|
||||||
|
|
||||||
|
def scrub_leftover_instance_variables
|
||||||
|
(instance_variables.map(&:to_sym) - RESERVED_INSTANCE_VARIABLES).each do |var|
|
||||||
|
remove_instance_variable(var)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -74,5 +74,23 @@ module ActiveSupport
|
||||||
|
|
||||||
assert_match %r{oh noes}, exception.message
|
assert_match %r{oh noes}, exception.message
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_teardown_should_scrub_instance_variables
|
||||||
|
tc = Class.new(TestCase) do
|
||||||
|
def test_true; @alpha = "a"; assert_equal "a", @alpha; end
|
||||||
|
end
|
||||||
|
|
||||||
|
test_name = 'test_true'
|
||||||
|
fr = FakeRunner.new
|
||||||
|
|
||||||
|
test = tc.new test_name
|
||||||
|
test.run(fr) {}
|
||||||
|
|
||||||
|
passed_var = IS_MINITEST ? :@passed : :@test_passed
|
||||||
|
ivars = test.instance_variables.map(&:to_sym)
|
||||||
|
|
||||||
|
assert ivars.include?(passed_var), "#{passed_var} should not have been scrubbed"
|
||||||
|
assert !ivars.include?(:@alpha), "@alpha should have been scrubbed"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -137,7 +137,7 @@ class SetupAndTeardownTest < ActiveSupport::TestCase
|
||||||
def test_inherited_setup_callbacks
|
def test_inherited_setup_callbacks
|
||||||
assert_equal [:reset_callback_record, :foo], self.class._setup_callbacks.map(&:raw_filter)
|
assert_equal [:reset_callback_record, :foo], self.class._setup_callbacks.map(&:raw_filter)
|
||||||
assert_equal [:foo], @called_back
|
assert_equal [:foo], @called_back
|
||||||
assert_equal [:foo, :sentinel, :foo], self.class._teardown_callbacks.map(&:raw_filter)
|
assert_equal [:scrub_leftover_instance_variables, :foo, :sentinel, :foo], self.class._teardown_callbacks.map(&:raw_filter)
|
||||||
end
|
end
|
||||||
|
|
||||||
def setup
|
def setup
|
||||||
|
@ -169,7 +169,7 @@ class SubclassSetupAndTeardownTest < SetupAndTeardownTest
|
||||||
def test_inherited_setup_callbacks
|
def test_inherited_setup_callbacks
|
||||||
assert_equal [:reset_callback_record, :foo, :bar], self.class._setup_callbacks.map(&:raw_filter)
|
assert_equal [:reset_callback_record, :foo, :bar], self.class._setup_callbacks.map(&:raw_filter)
|
||||||
assert_equal [:foo, :bar], @called_back
|
assert_equal [:foo, :bar], @called_back
|
||||||
assert_equal [:foo, :sentinel, :foo, :bar], self.class._teardown_callbacks.map(&:raw_filter)
|
assert_equal [:scrub_leftover_instance_variables, :foo, :sentinel, :foo, :bar], self.class._teardown_callbacks.map(&:raw_filter)
|
||||||
end
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
Loading…
Reference in a new issue