Robert Klemme
10/30/2006 8:05:00 PM
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