From: Robert Klemme Date: 2006-10-31T05:10:17+09:00 Subject: Re: __FILE__ for requiring file Jim Freeze wrote: > Hello > > I keep wondering if there is a way to have __FILE__ be delayed > in its evaluation. For example, in my tests cases, I usually do the > following so that my test cases are imune to where they are run from: > > class TestMyClass < Test::Unit::TestCase > > TEST_DIR = File.dirname(__FILE__) > DATA_DIR = File.join(TEST_DIR, "data") > > def data_file(file) > File.join(DATA_DIR, file) > end > > def test_xyz > open(data_file("fred")) > assert ... > end > end > > The problem is I have to add this to every test case since I can't put > data_file inside a module and include it without also having o define > TEST_DIR as a constant of Object inside every testcase. > > In other words, I don't want to do: > > TEST_DIR = File.dirname(__FILE__) > class TestMyClass < Test::Unit::TestCase > require 'test_helper' > include TestHelper > TestHelper.init __FILE__ > end > > This just seems a bit verbose. > > I guess what I need is something like: __REQUIRING_FILE__ > so my TestHelper module could be written as: > > module TestHelper > TEST_DIR = File.dirname(__REQUIRING_FILE__) > DATA_DIR = ...as above > end > > Has anyone ever needed such a thing? Is there a better way of solving > this problem? > > Thanks Untested - just sketching ideas: mytest.rb: require 'test/unit' class TC < Test::Unit::TestCase def open_data(f,&b) File.open(File.join(get_dir, f), &b) end def get_dir x = caller(2).shift if /^(.*):\d+:in / =~ x File.dirname $1 else raise "Whatever" end end end your_test.rb: class TestFoo < TC def test_x open_data("foo") do |io| io.each_line ... end end end robert