2012-02-19 124 views
7

我對/lib/classes中的類有RSpec測試,需要訪問zip文件(不上載)。該文件存儲在/spec/fixtures/files/test.zip中。我如何輸入正確的路徑,使其環境不可知,即沒有絕對路徑?RSpec中的相對文件路徑

回答

4

據我所知(從每月或每兩個月看),在spec_helper中使用__FILE__值獲取知道的內容路徑,然後在頂部構建自己的助手,沒有更好的方法那個。

很明顯,您可以在個別的*_spec.rb文件中使用相對於__FILE__的路徑。

+0

對於有相同問題的其他人:由於我的規範駐留在/ spec/classes中,所以我最終得到了:'File.dirname(__ FILE__)+'/../ fixture/files/test.zip'' – wintersolutions 2012-02-19 00:29:34

+0

這工作正常,但它如果您重新安排規格,可能會有點脆弱。當然,我們不能假定你使用Rails,但是如果你有權訪問項目的根目錄(Rails.root,Sinatra :: Application.root),這可能會 - 也可能不會 - 是一個更穩定的選擇。 – lab419 2013-09-04 10:21:25

+0

爲了使這個工作跨平臺,不要在字符串中嵌入'/',而是使用: File.join(File.dirname(__ FILE__),'..','fixtures','files','test。 zip') – Ultrasaurus 2013-11-11 18:33:01

13

Rails.root會給你的應用程序的根,所以

Rails.root.join "spec/fixtures/files/test.zip" 

會給你硬盤上的文件的絕對路徑,無關的應用程序的位置。

+0

使用rspec-rails,您可以更輕鬆地訪問fixture,如下所述:https://www.relishapp.com/rspec/RSpec的護欄/ v/3-5 /文檔/文件夾具 – thisismydesign 2017-04-26 13:05:52

1

我最近在這裏解決了這個問題,這就是我想出了:

定義一個常量,在您的spec_helper.rb(或同等學歷)指向的RSpec根:

RSPEC_ROOT = File.dirname __FILE__ 

使用此變量在*_spec.rb(或同等學歷)測試文件:

require 'spec_helper' 

File.open("#{RSPEC_ROOT}/resources/example_data.json") 

爲什麼選擇此解決方案?

  • 它不使用測試文件的位置,這可能是 隨時更改(spec_helper很可能不是)
  • 它不需要任何附加測試比現有的其他文件 require 'spec_helper'
  • 它不依賴on Rails的(不像Rails.root

這裏的要點是:https://gist.github.com/thisismydesign/9dc142f89b82a07e413a45a5d2983b07