mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Ruby 1.9 compat: introduce ActiveSupport::FrozenObjectError normalize TypeError vs RuntimeError handling. Closes #10645 [Frederick Cheung]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8510 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
parent
1bb208d7e5
commit
20d29b3797
5 changed files with 21 additions and 9 deletions
|
@ -104,7 +104,7 @@ module ActiveRecord
|
|||
# changed through means other than the writer method.
|
||||
#
|
||||
# The immutable requirement is enforced by Active Record by freezing any object assigned as a value object. Attempting to
|
||||
# change it afterwards will result in a <tt>TypeError</tt>.
|
||||
# change it afterwards will result in a <tt>ActiveSupport::FrozenObjectError</tt>.
|
||||
#
|
||||
# Read more about value objects on http://c2.com/cgi/wiki?ValueObject and on the dangers of not keeping value objects
|
||||
# immutable on http://c2.com/cgi/wiki?ValueObjectsShouldBeImmutable
|
||||
|
|
|
@ -25,7 +25,7 @@ class AggregationsTest < Test::Unit::TestCase
|
|||
|
||||
def test_immutable_value_objects
|
||||
customers(:david).balance = Money.new(100)
|
||||
assert_raises(TypeError) { customers(:david).balance.instance_eval { @amount = 20 } }
|
||||
assert_raise(ActiveSupport::FrozenObjectError) { customers(:david).balance.instance_eval { @amount = 20 } }
|
||||
end
|
||||
|
||||
def test_inferred_mapping
|
||||
|
@ -90,7 +90,7 @@ class AggregationsTest < Test::Unit::TestCase
|
|||
end
|
||||
|
||||
def test_nil_raises_error_when_allow_nil_is_false
|
||||
assert_raises(NoMethodError) { customers(:david).balance = nil }
|
||||
assert_raise(NoMethodError) { customers(:david).balance = nil }
|
||||
end
|
||||
|
||||
def test_allow_nil_address_loaded_when_only_some_attributes_are_nil
|
||||
|
|
|
@ -743,7 +743,7 @@ class BasicsTest < Test::Unit::TestCase
|
|||
client.destroy
|
||||
assert client.frozen?
|
||||
assert_kind_of Firm, client.firm
|
||||
assert_raises(TypeError) { client.name = "something else" }
|
||||
assert_raises(ActiveSupport::FrozenObjectError) { client.name = "something else" }
|
||||
end
|
||||
|
||||
def test_update_attribute
|
||||
|
@ -1682,19 +1682,19 @@ class BasicsTest < Test::Unit::TestCase
|
|||
|
||||
def test_except_attributes
|
||||
assert_equal(
|
||||
%w( author_name type id approved replies_count bonus_time written_on content author_email_address parent_id last_read),
|
||||
topics(:first).attributes(:except => :title).keys
|
||||
%w( author_name type id approved replies_count bonus_time written_on content author_email_address parent_id last_read).sort,
|
||||
topics(:first).attributes(:except => :title).keys.sort
|
||||
)
|
||||
|
||||
assert_equal(
|
||||
%w( replies_count bonus_time written_on content author_email_address parent_id last_read),
|
||||
topics(:first).attributes(:except => [ :title, :id, :type, :approved, :author_name ]).keys
|
||||
%w( replies_count bonus_time written_on content author_email_address parent_id last_read).sort,
|
||||
topics(:first).attributes(:except => [ :title, :id, :type, :approved, :author_name ]).keys.sort
|
||||
)
|
||||
end
|
||||
|
||||
def test_include_attributes
|
||||
assert_equal(%w( title ), topics(:first).attributes(:only => :title).keys)
|
||||
assert_equal(%w( title author_name type id approved ), topics(:first).attributes(:only => [ :title, :id, :type, :approved, :author_name ]).keys)
|
||||
assert_equal(%w( title author_name type id approved ).sort, topics(:first).attributes(:only => [ :title, :id, :type, :approved, :author_name ]).keys.sort)
|
||||
end
|
||||
|
||||
def test_type_name_with_module_should_handle_beginning
|
||||
|
|
|
@ -1,3 +1,11 @@
|
|||
module ActiveSupport
|
||||
if RUBY_VERSION >= '1.9'
|
||||
FrozenObjectError = RuntimeError
|
||||
else
|
||||
FrozenObjectError = TypeError
|
||||
end
|
||||
end
|
||||
|
||||
class Exception # :nodoc:
|
||||
def clean_message
|
||||
Pathname.clean_within message
|
||||
|
|
|
@ -61,4 +61,8 @@ class ExceptionExtTests < Test::Unit::TestCase
|
|||
assert_kind_of Exception, e
|
||||
assert_equal [], e.application_backtrace
|
||||
end
|
||||
|
||||
def test_frozen_error
|
||||
assert_raise(ActiveSupport::FrozenObjectError) { "foo".freeze.gsub!(/oo/,'aa') }
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue