2011-06-24 45 views
0

我在閱讀「Programming Ruby 1.9」。在208頁(在「在何處放置測試」一節),這本書具有組織爲在編程Ruby 1.9中需要文件和加載路徑的問題

roman 
    lib/ 
     roman.rb 
     other files... 
    test/ 
     test_roman.rb 
     other_tests... 
    other stuff 

代碼,並詢問我們如何讓我們的test_roman.rb文件,以瞭解roman.rb文件。

它說,不工作一個選項是構建的路徑進入測試代碼require聲明:

# in test_roman.rb 
require 'test/unit' 
require '../lib/roman' 

相反,它認爲更好的解決方案是應用程序的所有其他組件假設應用程序的頂級目錄是Ruby的負載路徑,使得測試代碼必須

# in test_roman.rb 
require 'test/unit' 
require '/lib/roman' 

,我們會通過調用ruby -I path/to/app path/to/app/test/test_roman.rb運行測試。

我的問題是:這是真的最好的方法嗎?好像

  1. 如果我們只是在與require_relative '../lib/roman'第一個選項替換require '../lib/roman',一切都將正常工作。
  2. 第二個選項(所有組件都具有Ruby的加載路徑中的頂級目錄)中的假設僅適用,因爲我們通過了-I path/to/app參數,這看起來有點雜亂。

我糾正,用require_relative代替require修復了所有問題嗎?無論如何,是否有理由更喜歡第二個選項?

回答

1

而且上的是同一本書利用的require_relative(第16章,組織你的源代碼)在測試範圍內,所以是的,我會說,使用它是個好東西,因爲它「總是從相對於調用它的文件的目錄的路徑加載文件「

當然,就像@christiangeek注意到的那樣,require_relative是1.9系列中的新功能,但有一個gem可以爲您提供相同的功能。

值得指出的是,Pickaxe也提供了一種方法,您可以在我之前提到的相同章節中堅持代碼。

1

require_relative確實使代碼更清晰,但僅在Ruby> 1.9.2上本機可用。這意味着如果你想讓你的代碼可以移植到Ruby的版本< 1.9.2你需要使用擴展或常規require AFAIK。這本書很可能是a)在1.9.2之前寫得很普遍或b)爲最低公分母提供一個例子。