2013-01-24 18 views
4

RSpec(2.12.2)給了我一個很難的時間。如果我想引用我的規格之一的類,這個類是不是在我/lib的根目錄下,它拋出一個錯誤:RSpec只能查看我的Lib目錄中的類

no such file to load -- test (LoadError) 

看來,我的規格可以被嵌套在一個文件夾結構,但是當我嘗試並需要一個嵌套文件夾中的類(例如lib/workers/conversion_worker.rb)時,出現此錯誤。

我在我的所有規範中都使用require'spec_helper',但即使對類的路徑進行硬編碼也會導致相同的錯誤。

通過這樣的結構:

-lib/ 
    - class_found.rb 
    - workers/ 
    - class_not_found.rb 

的規格如下所示:

# spec/workers/class_not_found_spec.rb 
require "spec_helper" 
require "class_not_found" 

describe ClassNotFound do  
    it "Does something" 
end 

下成功運行規範(-I標誌增加了一個路徑$ LOAD_PATH):

$ rspec spec/workers/class_not_found_spec.rb -I /Path/to/project/* 

因此,RSpec似乎沒有在其路徑中添加任何低於lib的東西。

我可以用require_relative成功需要class_not_found.rb:

require_relative "../../lib/workers/class_not_found.rb" #Succeeds 

但沒有使用要求:

require "lib/workers/class_not_found.rb" # Fails 
+0

所以你創建一個名爲'spec/lib/workers/class_not_found_spec.rb'的文件,寫入'require'spec_helper';模塊工人;描述ClassNotFound do ... end; end',並且rspec沒有找到源代碼? – mdesantis

+0

@ProGNOMmers我更新了這個問題。希望現在很清楚。 – Undistraction

+0

是你的項目一個rails應用程序?如果是的話,你應該將'spec/workers'移動到'spec/lib/workers' – mdesantis

回答

7

我不知道你是否有你喜歡的答案,但似乎你不需要你的文件正確。

'lib/class_found.rb'文件應該要求所有的庫文件,所以它應該是這個樣子:

require 'workers/class_not_found' 

和你spec_helper.rb需要在你的lib文件夾中的主文件,所以它應該是這個樣子:

require 'class_found' 

rspec的自動加載'spec/spec_helper.rb'當它運行時,它還會自動添加'lib'文件夾,其LOAD_PATH,讓你的在'lib/class_found.rb'需要正確看到並且需要。

+0

謝謝拉吉。是的,我已經完成了,但你的回答是正確的。似乎lib已添加,但lib的子文件夾不是,因此子文件夾中的任何內容都需要基於lib以及文件名的路徑。我的一個愚蠢的錯誤。 – Undistraction

0

根據你的目錄樹,文件class_not_found.rb是一個子目錄workers。您忘記添加路徑到您的require

require 'workers/class_not_found' 

會是正確的。

順便說一句:你沒有require類,你require文件

+0

對不起。糟糕的語義。就我所知,添加路徑不起作用,並且RSpec應該允許沒有路徑的文件名。 – Undistraction

+0

'require'與RSpec無關。 'require'是來自Ruby核心庫的普通Ruby方法。它搜索'$ LOAD_PATH'。沒有更多,沒有更多。 –