From: Mike Harris Date: 2007-02-03T08:02:00+09:00 Subject: Re: How do Rakefiles "know" about built-in Rake methods? Jeff wrote: >I'm looking into a way to let business users write functional tests in >rails, and I wanted to have my functional test file load an external >file to supply the body of a method. It occurs to me that Rake must >have solved a similar problem, but I can't quite figure out how Jim >did it. > >What I want to write is something like this: > >class MyTests < Test::Unit::TestCase > > # typical setup and teardown here > > # a test method to "wrap" an external ruby file > > def test_acceptance > load 'acceptance.rb' # load file written by business user > end > > def foo > end > > def bar > end > >end > >I admit it didn't look right when I wrote it. I had hoped that the >code in acceptance.rb could be bare Ruby code. in other words, it >would look like and feel top-level Ruby, but could call foo and bar >because it's really in the midst of the test_acceptance method. > >So I conclude that load() starts a new scope. I guess I could add my >methods to Object and/or Module to get them to be seen by the external >file, but I don't think that does any good either. > >But Rake does something similar, right? I think it defines the task() >method, etc. and you can refer to them in "bare" ruby code in your >rake file. > >What glue is being used in Rake that I'm missing? > >Thanks! >Jeff > > > > > The task method is defined by Rake at the top level, i.e. a normal method not within the scope of a class def task(args, &block) Rake::Task.define_task(args, &block) end Method defined in the top level context are available globally, which is why you can require 'rake' and then use the task method.