2014-06-20 56 views
1

今天,我遇到了一個與我的規格非常奇怪的問題。當我運行spec命令時沒有指定任何特定的目錄/文件,我的測試工作很好,全部是綠色的。但是,如果我要指定一個目錄或文件,rspec會拋出一些(隨機)錯誤,具體取決於我是否使用rspec和spring。更重要的是,昨天,就在我工作結束之前,一切都運轉良好。從那時起我沒有碰過任何東西,現在它因爲某種原因被打破了。這是怎麼一回事呢:無法運行單個規格文件

  • rspec spec/requests/api/v1/users_spec.rb
    結果
    uninitialized constant FactoryGirl

  • spring stop; spring rspec spec/requests/api/v1/users_spec.rb
    結果
    undefined local variable or method 'some_url_helper_here'

在運行spring rspecrspec運行良好,沒有任何例外。我的規格文件看起來或多或少是這樣的:

# spec/requests/api/v1/users_spec.rb 

require 'spec_helper' 

describe 'Users API v1', :type => :request do 
    before do 
    @user = FactoryGirl.create(:user) # that line throws an exception about unitialized constant FactoryGirl 
    end 

    # ... 
end 

你知道這到底是怎麼回事嗎?預先感謝任何線索。

回答

1

您在項目的require s中沒有正確滿足相關性的問題。

總體而言,當您運行或測試整個應用程序時,所有內容都會加載。但某些個別項目文件(由單個規格加載)不會處理正確的require,或者以錯誤的順序處理它們(引用符號的時間太晚)。

您將需要通過文件,單獨運行規格,找到缺失的符號,並確保相關庫在使用前爲required。一旦你用這種方法找出了正確的依賴關係,你可能需要將常見的依賴分解成單個幫助器。您可能希望安排他們也符合一致的風格/慣例,例如單數依賴僅在需要它們的文件中得到require d,否則有兩個助手 - 一個用於加載測試/開發依賴關係,它本身在所有單獨的測試助手和腳本中都是require d,另一個用於加載應用程序運行時依賴關係。

此外,請檢查您的項目是否「聰明」自動加載文件夾中的所有內容,例如

Dir["lib/*.rb"].each{ |file| require file } 

這可以使您的文件系統的加載順序隨機化。如果這些文件之間存在真正的依賴關係,因此必須在'y.rb'之前加載'x.rb',那麼根據上次文件夾內容更改後機器發生的情況,系統會成功/失敗。

+0

感謝您的解釋。但是它昨天在工作的事實呢?它發生在我以前幾次。它總是一樣的 - 我正在處理我的項目,停下來一會兒,當我回來時,它再次表現得如此。然後,一段時間後,一切都恢復正常。這是瘋了 – mbajur

+0

@mbajur:你有任何代碼是自動加載所需的文件,使用目錄列表,例如'風向[ 「LIB/* RB。」]每個{|。文件|需要文件}'?這可以隨意加載歸檔文件系統的加載順序,這意味着根據上次文件夾內容更改發生的情況,系統會成功/失敗。 –

+0

嗯,我沒有像我自己寫的東西,只是由raiils/rspec生成器默認的。 – mbajur