2010-07-15 34 views
19

所以我正在寫一些rspec測試,我很尷尬,因爲我缺乏對Ruby的理解。紅寶石需要'文件'和相對位置

我有一個文件結構如下所示:

  • GUI_Tests /測試/ test_spec.rb
  • GUI_Tests/windows_gui.rb
  • GUI_Tests/upload_tool.rb

當我運行test_spec.rb文件的規範時,我需要包含upload_tool文件,如下所示:

spec -r ../upload_tool -fs test_spec.rb 

然後,upload_tool需要windows_gui.rb,就像這樣:

require '../windows_gui' 

我的問題是,爲什麼讓我不得不引用相對windows_gui.rb到test_spec.rb(需要../),而不是upload_tool.rb?這對我來說是錯誤的,我想要在測試規範的背景下使用upload_tool.rb,這意味着每次都需要更改。

顯然我錯過了一些東西,但如果我沒有引用相對於測試規範,我得到一個文件未找到錯誤。

對不起,在這裏很無知,但我空手而來。任何想法讚賞。

BB

+2

不要感覺不好 - 我覺得處理相對路徑是關於ruby最討厭的事情之一。我已經列出它[你想在紅寶石語言中改進的東西](http://stackoverflow.com/questions/585457/what-are-the-things-you-would-like-improved-in -ruby-language/3261063#3261063) – 2010-07-16 00:24:41

+0

2012年8月 - 請注意,這篇文章現在已經兩歲了。現在大多數人都在1.9.2上。看到這篇文章http://stackoverflow.com/questions/9345412/relative-file-path-in-rspec也爲最好的解決方案(2012年2月) – 2012-08-26 14:20:59

回答

20

你不知道。 require s是相對於當前目錄,在您的情況下是GUI_Tests/Tests。如果你這樣做,而不是:

cd .. 
spec -r upload_tool -fs Test/test_spec.rb 

你將不得不使用:

require 'windows_gui' # without '../' 

最常見的方式來解決這個問題是使用File.dirname(__FILE__)

require File.join(File.dirname(__FILE__), '..', 'windows_gui') 

注意:紅寶石1.9.2需要改變它的默認值:Ruby: require vs require_relative - best practice to workaround running in both Ruby <1.9.2 and >=1.9.2

+1

完美 - 就像我說的,我甚至不得不問,但尷尬,但我很高興我做到了。這很有道理。 – 2010-07-15 17:51:13

+19

實際上,'require'不是*相對於當前目錄,而是相對於*搜索路徑*(即特殊常量'$ LOAD_PATH'或其別名$:')。剛剛發佈的舊版本的Ruby(即除了尚未發行但即將發佈的1.9.2版本之外的所有版本),當前目錄('.')默認位於搜索路徑中:'p $ :. include ?('。')#=> true'。但是,從Ruby 1.9.2開始不再是這種情況,不應該依賴它。在Ruby 1.9中,您可以使用'require_relative',它相對於從中調用的源文件而不是搜索路徑。 – 2010-07-15 18:10:54

+0

@Jorg:但是如果我在1.9中運行這個:'$ :. replace [];需要'../ somefile',它工作。 – Adrian 2010-07-15 18:56:37