I’m reading through “Programming Ruby 1.9”. On page 208 (in a “Where to Put Tests” section), the book has the code organized as
roman
lib/
roman.rb
other files...
test/
test_roman.rb
other_tests...
other stuff
and asks how we get our test_roman.rb file to know about the roman.rb file.
It says that one option that doesn’t work is to build the path into require statements in the test code:
# in test_roman.rb
require 'test/unit'
require '../lib/roman'
Instead, it says a better solution is for all other components of the application to assume that the top-level directory of the application is in Ruby’s load path, so that the test code would have
# in test_roman.rb
require 'test/unit'
require '/lib/roman'
and we’d run the tests by calling ruby -I path/to/app path/to/app/test/test_roman.rb.
My question is: is this realy the best way? It seems like
- If we simply replaced
require '../lib/roman'in the first option withrequire_relative '../lib/roman', everything would work fine. - The assumption in the second option (that all components have the top-level directory in Ruby’s load path) only works because we pass the
-I path/to/appargument, which seems a little messy.
Am I correct that replacing require with require_relative fixes all the problems? Is there any reason to prefer the second option anyways?
Further on, that same book makes use of
require_relative(Chapter 16, Organizing your source code) in the context of testing, so yes, I would say that using it is a Good Thing, since it “always loads files from a path relative to the directory of the file that invokes it”.Of course, like @christiangeek noticed, require_relative is new in the 1.9 series, but there’s a gem that provides you with the same functionality.
It might be worth pointing out that the Pickaxe too provides a little method you can stick in your code in the same chapter I mentioned before.