2013-10-31 27 views
1

這可能與「Inconsistent behavior when referencing constants inside a module」類似,但我不確定。如何建立一個失敗的測試?測試通過但Rails服務器說:'未初始化常量'

我處於測試工作但我的應用程序失敗的情況下,雖然我可以修復應用程序,但我寧願有一個測試失敗,如果應用程序!

這裏的基本設置:

admin_controller.rb(像ApplicationController中,其他控制器繼承)

class AdminController < ActionController::Base 

    # If a session_grouping is set, it should be used until unset. 
    def session_grouping 
    session[:default_grouping] || DraftGrouping.new 
    end 

    ... 

end 

admin_controller_test.rb

require 'test_helper' 
class AdminControllerTest < ActionController::TestCase 

    def test_get_session_grouping 
    assert_equal DraftGrouping, @controller.session_grouping.class, 'without a grouping set, a draft grouping should be returned' 
    end 

    ... 

end 

該測試(和其他我爲了清楚而排除的測試)都通過了DraftGrouping定義如下:

grouping.rb

class Grouping < ActiveRecord::Base 
    ... 
end 

# Used as a stand-in for a real grouping until there is something to save. 
class DraftGrouping 

    # Any call to real_grouping instantiates the grouping in the database. 
    def real_grouping 
    @real_grouping || @real_grouping = Grouping.create! 
    end 

    ... 

end 

然而,在應用中使用時,AdminController#session_grouping失敗消息NameError (uninitialized constant AdminController::DraftGrouping): app/controllers/admin_controller.rb:5:in session_grouping'`

我可以通過定義DraftGrouping解決此所有在Grouping以內,並且隨處可以撥打Grouping::DraftGrouping。實際上,無論如何,這是一個更清晰的做法,所以我很樂意做到這一點。但是,我應該如何爲此建立一個失敗的測試?

回答

1

您是不是在grouping.rb內指定DraftGrouping?它看起來像你可能來自你的代碼示例。

如果是這樣,那麼當試圖在admin_controller.rb中實例化它時,Rails的自動加載例程可能找不到它。如果您的測試已經參考Grouping(因此已經加載了grouping.rb並因此定義了DraftGrouping),那麼您的測試可能會通過。

我想嘗試的第一件事是將DraftGrouping的定義移動到draft_grouping.rb

+0

是的,這絕對有道理。我會放棄它。 – Leo

+0

然而,我的問題是,測試如何設法加載'DraftGrouping'。即使只是隔離運行測試,所以我想** test_helper.rb **加載環境的方式必須與服務器有所不同,這似乎可能會引入不一致。 – Leo

+0

感謝您對此的意見。您的方法可以修復應用程序中的錯誤,並幫助我更好地理解自動加載。但是,我的問題確實是如何爲此構建一個失敗的測試。我的全堆棧集成測試也不會失敗,所以我不知道如何在沒有手動測試的情況下發現這個問題。 – Leo

相關問題