提交 924ef18d 编写于 作者: N Nicholas Seckar

Detect missing_constants calls from removed modules and fail accordingly.

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4780 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
上级 2b37d599
*SVN*
* Detect missing_constants calls from removed modules and fail accordingly. [Nicholas Seckar]
* Stop using defined? in Dependencies.qualified_const_defined? since defined? may invoke const_missing. [Nicholas Seckar]
* Dependencies can autoload directories of nested classes. [Jeremy Kemper]
......
......@@ -182,6 +182,10 @@ def load_missing_constant(from_mod, const_name)
# If we have an anonymous module, all we can do is attempt to load from Object.
from_mod = Object if from_mod.name.empty?
unless qualified_const_defined?(from_mod.name) && from_mod.name.constantize.object_id == from_mod.object_id
raise ArgumentError, "A copy of #{from_mod} has been removed from the module tree but is still active!"
end
raise ArgumentError, "Expected #{from_mod} is not missing constant #{const_name}!" if from_mod.const_defined?(const_name)
qualified_name = qualified_name_for from_mod, const_name
......
......@@ -372,4 +372,19 @@ def test_const_missing_within_anonymous_module
end
end
def test_removal_from_tree_should_be_detected
with_loading 'dependencies' do
root = Dependencies.autoload_paths.first
c = ServiceOne
Dependencies.clear
assert ! defined?(ServiceOne)
begin
Dependencies.load_missing_constant(c, :FakeMissing)
flunk "Expected exception"
rescue ArgumentError => e
assert_match %r{ServiceOne has been removed from the module tree}i, e.message
end
end
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册