2011-04-13 93 views
1

我正在進行功能測試,需要聲明某個XHTML標記存在於某個控制器集合中。基本上,我這樣做:如何確定Rails控制器的默認操作?

class ApplicationControllerTest < ActionController::TestCase 
    def setup 
    @controller = ApplicationController.new 
    end 
    # [...] 
    def test_foo_bar_and_baz_include_stylesheet 
    [FooController, BarController, BazController].each do |controller| 
     @controller = controller.new 
     get :show 
     assert_select 'head > link[rel="stylesheet"]' 
    end 
    end 
end 

的問題是,不是所有的控制器具有:show作用。我需要做的是向控制器或路由配置詢問控制器的默認操作,並以此調用get

更新:Joseph Silvashy是正確的:我最終將我的控制器get分成單獨的測試用例。解決「默認」路線問題已經夠糟糕了,直到我發現我的一些路線附加了條件,我將不得不解析它們以制定正確的get呼叫。最後,Rails功能測試在同一個測試用例中多次調用get的效果並不好,尤其是當這些調用正在觸發多個控制器時。 :(

我認爲這裏的教訓是一個大家都知道的心臟,但有時是難以接受:如果代碼看起來毛茸茸的,你可能就錯了;)

回答

2

控制器不有一個「默認」的看法或行動,另外動作可以被命名爲任何你想要的,他們沒有成爲標準indexshownew,等...

我很有可能要:get合適爲每個你想測試的控制器採取行動。無論如何,每個測試都可能會有所不同,即使現在他們都有相同的要求,但我認爲每個測試都要寫一個測試是有意義的。

+0

那麼有沒有辦法以編程方式訪問路由信息? – 2011-04-13 08:59:01

+0

考慮到我測試的特殊性,我嚴重懷疑測試會發生偏差,所以我認爲我目前的方法可能是體面的。 – 2011-04-13 09:00:27

+1

當然你可以從以下路由獲得路由:'ActionController :: Routing :: Routes' – 2011-04-13 10:11:27

0

嘗試使用respond_to函數:http://www.ruby-doc.org/core/classes/Object.html#M001005 檢查方法exitst。

+0

'#respond_to?'對於避免嘗試控制器不支持的操作當然是有用的,但它無法幫助我找出答案控制器將通過「默認」執行什麼操作(即根據路線)。 – 2011-04-14 05:42:16

相關問題