2013-03-25 40 views
2

這些中的哪一個是編寫集成(請求)測試的「正確」方式。在集成測試中使用命名路由是否合適?

it "should be successful" do 
    get "/about/terms" 
    response.should be_success 
end 

it "should be successful" do 
    get about_terms_path 
    response.should be_success 
end 

回答

4

about_terms_path是正確的,因爲自定義路由路徑可能會在路徑文件改變,但路線的名稱應保持不變。

前者會導致脆性測試。

如果路由的名稱發生了變化,那麼在Rails應用中對該路由的所有引用都需要更改,您的rspec測試也會發生變化。

如果路徑的路徑發生了變化,那麼Rails應用或rspec測試中的任何內容都不需要更改。

編輯:

如果你要測試的路線,看看這個https://www.relishapp.com/rspec/rspec-rails/docs/routing-specs

+0

我同意命名路線是要走的路,但也許有一個稍微不同的原因。我會說你的應用程序代碼的白話應該與你的測試代碼的白話匹配。由於Rails希望您在應用程序中使用命名路由,因此在我看來,在測試中使用命名路由是合乎邏輯的。 – 2013-03-25 13:36:32

2

我會說要麼是好的,我個人比較喜歡第一個。

整合測試是模仿人類的眼睛和行爲。人類可以看到「/ about/terms」,而不是「about_term_path」。

此外,兩個建議:

  1. 最好使用水豚允許使用JavaScript的Web驅動程序。這樣,「get」將不起作用,而是使用「visit」

  2. 無需檢查集成測試中的響應,這是功能測試(控制器)的工作。直接轉到真正的觀點。

添加

要回答Jason的問題。是的,我始終在集成測試中始終使用硬編碼路線。

原因是外部進場方法,這是驗收測試驅動開發的關鍵點。當我編寫集成測試時,我不知道指定的路由,因爲routes.rb尚未修改。或者我應該知道,但我不在乎那一刻。

當rspec告訴我「沒有匹配的路線」時,我說,很好,讓我生成控制器並檢查routes.rb。

+1

我認爲在你的應用程序代碼和測試代碼之間保持一致是一個好主意,所以我會說在兩者中都使用兩個命名路由或不命名路由。由於Rails似乎希望您在硬編碼路徑上使用命名路由,所以我會說在兩個地方都使用命名路由。 – 2013-03-25 13:39:31

+0

@JasonSwett,謝謝你的觀點:)我在回答中加入了我的觀點。 – 2013-03-25 13:47:36

+0

有趣的一點。我現在不太確定我的立場是否正確。 – 2013-03-25 13:50:37

相關問題