diff options
author | Jon Leighton <j@jonathanleighton.com> | 2011-09-12 22:12:12 +0100 |
---|---|---|
committer | Jon Leighton <j@jonathanleighton.com> | 2011-09-13 00:01:58 +0100 |
commit | ac687ed651773fccecbc22cd6d8b07d5439ceb76 (patch) | |
tree | eba4a000c8053dbe32f648d6042a494a2d16095f /activemodel/test | |
parent | cf115d2f8ef48764e095aa453f729b60705088f1 (diff) | |
download | rails-ac687ed651773fccecbc22cd6d8b07d5439ceb76.tar.gz rails-ac687ed651773fccecbc22cd6d8b07d5439ceb76.tar.bz2 rails-ac687ed651773fccecbc22cd6d8b07d5439ceb76.zip |
Let Ruby deal with method visibility.
Check respond_to_without_attributes? in method_missing. If there is any
method that responds (even private), let super handle it and raise
NoMethodError if necessary.
Diffstat (limited to 'activemodel/test')
-rw-r--r-- | activemodel/test/cases/attribute_methods_test.rb | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/activemodel/test/cases/attribute_methods_test.rb b/activemodel/test/cases/attribute_methods_test.rb index 61ff5fca7a..198e4c3c06 100644 --- a/activemodel/test/cases/attribute_methods_test.rb +++ b/activemodel/test/cases/attribute_methods_test.rb @@ -32,6 +32,16 @@ private end alias attribute_test attribute + + def private_method + "<3 <3" + end + +protected + + def protected_method + "O_o O_o" + end end class ModelWithAttributesWithSpaces @@ -151,4 +161,30 @@ class AttributeMethodsTest < ActiveModel::TestCase assert_equal 'value of foo', klass.new.foo end + + test 'should not interfere with method_missing if the attr has a private/protected method' do + m = ModelWithAttributes2.new + m.attributes = { 'private_method' => '<3', 'protected_method' => 'O_o' } + + # dispatches to the *method*, not the attribute + assert_equal '<3 <3', m.send(:private_method) + assert_equal 'O_o O_o', m.send(:protected_method) + + # sees that a method is already defined, so doesn't intervene + assert_raises(NoMethodError) { m.private_method } + assert_raises(NoMethodError) { m.protected_method } + end + + test 'should not interfere with respond_to? if the attribute has a private/protected method' do + m = ModelWithAttributes2.new + m.attributes = { 'private_method' => '<3', 'protected_method' => 'O_o' } + + assert !m.respond_to?(:private_method) + assert m.respond_to?(:private_method, true) + + # This is messed up, but it's how Ruby works at the moment. Apparently it will be changed + # in the future. + assert m.respond_to?(:protected_method) + assert m.respond_to?(:protected_method, true) + end end |