RSpec 添加了一个“描述”方法来做顶级命名空间。但是,他们不是简单地在任何类/模块之外定义方法,而是这样做:
# code from rspec-core/lib/rspec/core/dsl.rb
module RSpec
module Core
# Adds the `describe` method to the top-level namespace.
module DSL
def describe(*args, &example_group_block)
RSpec::Core::ExampleGroup.describe(*args, &example_group_block).register
end
end
end
end
extend RSpec::Core::DSL
Module.send(:include, RSpec::Core::DSL)
与简单地在任何模块和类之外定义描述相比,使用这种技术有什么好处?(据我所知,DSL 模块在 rspec-core 的其他任何地方都没有使用。)