2017-07-11 34 views
0

因此,我正在編寫一個測試,用於定位特定文件metadata.json,以解析爲使用RSpec測試的Ruby的JSON gem。我的目錄層次結構如下所示:使用Rake在Ruby中解析的文件路徑

|_tests 
    - metadata.json 
    - Rakefile 
    - Gemfile 
    |_specs 
    -tagging_specs 

的代碼是一個簡單的文件讀取傳入相對路徑,所以:

print "Getting values from metadata.json file" 
#Path to metadata.json file 
metadata = File.read('../metadata.json') 
values = JSON.parse(metadata) 

直接調用使用RSpec的命令時,這工作得很好。但是當我計劃對多個測試進行測試時,我選擇使用Rake來管理我的規格。因爲這樣做,但我得到一個錯誤,有一個完整的目錄路徑通過諸如home/work/projects/tests/metadata.json

該錯誤消息我得到使用../metadata.json時與Rake是:

Failure/Error: metadata = File.read('../metadata.json') 

Errno::ENOENT: 
No such file or directory @ rb_sysopen - ../metadata.json 
./spec_tests/tagging_standards_spec.rb:7:in 'read' 
./spec_tests/tagging_standards_spec.rb:7:in 'block in <top (required)>' 
./spec_tests/tagging_standards_spec.rb:3:in '<top (required)>' 
No examples found. 

Finished in 0.00072 seconds (files took 0.17953 seconds to load) 
0 examples, 0 failures, 1 error occurred outside of examples 

這如果只是我使用這些測試,那麼woukdnt會成爲問題。然而,他們的目的是爲他人提供工作的基礎,所以他們的目錄路徑當然會有所不同。那麼Ruby或Rake中有什麼方法可以使它更具動態性和可重用性?

回答

1

__dir_方法返回你所在的當前文件的目錄,所以這應該爲你工作:

File.read(__dir__ + "/../metadata.json") 
+0

完美的工作。謝謝 – DevLuke

+0

然後標記答案:) – nattfodd

1

另外獲得「完整路徑」,你可以使用File::expand_path

將轉換一個絕對路徑名的路徑名。除非給出dir_string,否則相對路徑將從進程的當前工作目錄引用,在這種情況下,它將用作起點。給定的路徑名​​可以以「〜」開頭,該擴展到進程所有者的主目錄(環境變量HOME必須正確設置)。 「〜user」擴展到指定用戶的主目錄。

例如:

File.expand_path('../metadata.json',__FILE__) 

這將首先解決其當前文件從其所例如稱爲的__FILE__父目錄Rakefile然後它將使用通過的相對路徑../metadata.json找到所需的特定文件並解析絕對路徑