2012-07-03 29 views
0

我有一個Rails 3應用程序,並且正在嘗試編寫所有路由的測試。如何對帶有約束的Rails路由進行功能測試?

想象一下這個非常簡單的途徑:

resources :jobs, :constraints => {:id => /\d+/} 

我現在想對此進行測試。在我的功能測試,它很容易編寫使用Rails中的built-in assertions爲正的情況下斷言:

assert_routing "jobs/4", { :controller => "jobs", :action => "show", :id => "4" } 

什麼是斷言負的最佳方式?即,約束失敗的「jobs/wibble」沒有被路由,而是返回一個錯誤?是否有一些簡單的方法來實現「assert_not_routing」或類似的東西?有沒有人處理過這個?

回答

0

你試過斷言路徑的零路線?

+0

我做到了,但那不起作用。我找到了解決方案。 –

1

我最終發現的解決方案是在功能測試中測試有效URL的路由,並在集成測試中測試無效URL的非路由。

我創建了一個名爲RoutesTest的新集成測試類,並在那裏存儲了不應該在任何地方路由的所有URL。

require 'test_helper' 

class RoutesTest < ActionDispatch::IntegrationTest 
    test "broken routes don't work" do 
    assert_raise(ActionController::RoutingError) { 
     get "/jobs/wibble" 
    } 
    end 
end 

我仍然在功能測試中測試有效路線。有一些測試神學在這裏失敗了,最有可能的是:在我們提出的獨立而相當荒謬的理論中,關於特定測試應該在單元集成還是集成與功能理念的區別,這似乎有點奇怪。但我寧願完成這項工作,也不願意與人們進行神學測試。所以我就是這樣做的。

+0

湯姆 - 有沒有測試神學的原因,你不使用rspec? https://www.relishapp.com/rspec/rspec-rails/v/2-4/docs/routing-specs/be-routable-matcher。或者這是不是在做你以後的事情? (should_not be_routable) –

+0

我不使用RSpec的主要原因是懶惰,以及過去糟糕的經驗,使用我的Rails 2.x應用程序對Cucumber造成嚴重破壞。我可能應該切換到RSpec。 –

+0

那麼我會投票答覆你的答案,因爲它是「正確的」,現在還附帶了一個新增的「可能使用rspec」的附加內容! –